Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PCRE - parsowanie string'a
piotrooo89
post
Post #1


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




hej,

mam lekki problem z regexp'ami, do rzeczy. mam takie stringi (możliwości):

Kod
jeden+"+test"+dwa
jeden+"test+"+dwa
jeden+"te+st"+dwa


i teraz chce "porozbijać" te ciągi względem znaku +, wynik:

Kod
jeden; "+test"; dwa
jeden; "test+"; dwa
jeden; "te+st"; dwa


oczywiście te rozbicia maja być tablicą otrzymana przez preg_split.


stworzyłem takie wyrażenie:

Kod
#((?<!")\+)|(\+(?!(.*)"))#si


niestety dopasowuje mi tylko do pierwszego ciągu:

Kod
jeden; "+test"; dwa


pozostałe dwa nie parsują się poprawnie, jakiejś sugestie?


--------------------
Go to the top of the page
+Quote Post
Niktoś
post
Post #2





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


A spróbuj to :
Cytat
^([\w\+]+)([\w\+\"]+)([\w\+]+)$
Go to the top of the page
+Quote Post
piotrooo89
post
Post #3


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




@Niktoś Twoj wyrażenie nie dopasowuje się do żadnego ciągu, i też nic nie chce dzielić za pomocą split'a smile.gif


--------------------
Go to the top of the page
+Quote Post
Niktoś
post
Post #4





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


A może to?
^([\w]+\+)?|([\w\"]+\+)?|([\w]+\+)?$

Patrze w regexp.pl
i rozbija wszystkie wyrazy z + na grupy.
Go to the top of the page
+Quote Post
piotrooo89
post
Post #5


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




  1. $str = 'jeden+"test+"+dwa';
  2. $a = preg_split('#^([\w]+\+)?|([\w\"]+\+)?|([\w]+\+)?$#si', $str);
  3.  
  4. print_r($a);


i w wyniku otrzymuje:

Kod
Array
(
    [0] =>
    [1] =>
    [2] =>
    [3] =>
    [4] => d
    [5] => w
    [6] => a
    [7] =>
)


--------------------
Go to the top of the page
+Quote Post
cycofiasz
post
Post #6





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Może użyj po prostu fgetcsv i jako separator podaj + a jako otokę podaj "
Go to the top of the page
+Quote Post
piotrooo89
post
Post #7


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




@cycofiasz Twój pomysł byłby super, ale mam pewnie problem ponieważ potrzebuje stringi w stylu:

Kod
jeden
"test+"
dwa


są mi potrzebne te "", a on je wycina...


--------------------
Go to the top of the page
+Quote Post
Niktoś
post
Post #8





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Ciężka sprawa bo praktycznie nie ma separatora, nie można użyć + brak odstępów,(") też za bardzo nie można użyć ,myśle o indexOf po + jechać ale też nie za bardzo bo słowo te+st rozdzieli.
Nic innego tylko zaawansowana funkcja.Wydaje mi się ,że samym regexpem czy fgetcsv tego nie zrobisz.
Ale fajna zagadka,pomyśle nad nią jutro.

Ten post edytował Niktoś 1.03.2012, 21:47:25
Go to the top of the page
+Quote Post
Bags_Bunny
post
Post #9





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

Ostrzeżenie: (0%)
-----


Jeśli nie upierasz się na preg_split, to pobaw się tym:
  1. preg_match_all('{[^+"]+|"[^"]+"}', $string, $matches);


Ten post edytował Bags_Bunny 2.03.2012, 01:28:00


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
piotrooo89
post
Post #10


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




dzięki za podpowiedz jednak napisze to w ten sposób i sobie obrobię te dane. jeśli ktoś natknął by się jak to ma działać za pomocą preg_splita, to chętnie poznam odpowiedz.


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Szybciej będzie chyba napisać banalny wręcz parser, który po prostu przeleci znak po znaku i rozdzieli względem znaku "+". Do tego proste sprawdzanie Czy znajdujemy się pomiędzy cudzysłowem?, ignorujące znak "+".

O dziwo w PHP najprawdopodobniej będzie to najwolniejsze rozwiązanie. wink.gif
Go to the top of the page
+Quote Post
piotrooo89
post
Post #12


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




Cytat(Crozin @ 2.03.2012, 10:40:04 ) *
Szybciej będzie chyba napisać banalny wręcz parser, który po prostu przeleci znak po znaku i rozdzieli względem znaku "+". Do tego proste sprawdzanie Czy znajdujemy się pomiędzy cudzysłowem?, ignorujące znak "+".

O dziwo w PHP najprawdopodobniej będzie to najwolniejsze rozwiązanie. wink.gif


właśnie tak miałem teraz, o ile przy string'u, który ma kilkanaście znaków to jest spoko, ale jak już wzrasta złożoność obliczeniowa wraz z wzrostem złożoności string'u robi się nie wydajnie, dlatego chciałem to zrzucić na PCRE smile.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 10:45