Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PCRE - parsowanie string'a
Forum PHP.pl > Forum > PHP
piotrooo89
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?
Niktoś
A spróbuj to :
Cytat
^([\w\+]+)([\w\+\"]+)([\w\+]+)$
piotrooo89
@Niktoś Twoj wyrażenie nie dopasowuje się do żadnego ciągu, i też nic nie chce dzielić za pomocą split'a smile.gif
Niktoś
A może to?
^([\w]+\+)?|([\w\"]+\+)?|([\w]+\+)?$

Patrze w regexp.pl
i rozbija wszystkie wyrazy z + na grupy.
piotrooo89
  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] =>
)
cycofiasz
Może użyj po prostu fgetcsv i jako separator podaj + a jako otokę podaj "
piotrooo89
@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...
Niktoś
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.
Bags_Bunny
Jeśli nie upierasz się na preg_split, to pobaw się tym:
  1. preg_match_all('{[^+"]+|"[^"]+"}', $string, $matches);
piotrooo89
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.
Crozin
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
piotrooo89
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.