PDA

Pogčedajte punu verziju : preg_match_all peripetija


godza
27. 02. 2008., 19:19
Ev' ovako

recimo da imam ovakav string


$string = "
{lang nesto=nesto_drugo}Pera{/lang}
{lang nesto=nesto_trece}Zdera{/lang}
{lang}Zvera{/lang}
";

koristim


preg_match_all('/\{lang(.*)\}(.*)\{\/lang\}/', $string, $results);


rezultat mi je ono shto zelim tj niz $results je

array (3) {
[0] => array {
[0] => '{lang nesto=nesto_drugo}Pera{/lang}',
[1] => '{lang nesto=nesto_trece}Zdera{/lang}',
[2] => '{lang}Zvera{/lang}',
}
[1] => array {
[0] => ' nesto=nesto_drugo',
[1] => ' nesto=nesto_trece',
[2] => '',
}
[2] => array {
[0] => 'Pera',
[1] => 'Zdera',
[2] => 'Zvera',
}
}

Dakle, 2gi element rezultata tj


array {
[0] => 'Pera',
[1] => 'Zdera',
[2] => 'Zvera',
}

je ono shto ja zelim da izvuchem.

... ali problem nastaje kada je string $string one liner tj


$string = "{lang nesto=nesto_drugo}Pera{/lang} {lang nesto=nesto_trece}Zdera{/lang} {lang}Zvera{/lang}";

tada mi je rezultat sledece


array (3) {
[0] => array {
[0] => '{lang nesto=nesto_drugo}Pera{/lang} {lang nesto=nesto_trece}Zdera{/lang} {lang}Zvera{/lang}',
}
[1] => array {
[0] => ' nesto=nesto_drugo}Pera{/lang} {lang nesto=nesto_trece}Zdera{/lang} {lang}',
}
[2] => array {
[0] => 'Zvera',
}
}

Kao sto vidite ne dobijam ono shto zelim, a to su stringovi unutar "lang" taga.

Ima li neko ideju kako da resim ovo?

Okacicu php fajl uskoro, ako je ovo konfuzno

godza
27. 02. 2008., 21:39
Ups, nisam video da ima forum za regexp-ove. Izvin'te!

bluesman
27. 02. 2008., 22:02
Samo stavi modifier /U na kraju:

preg_match_all('/\{lang(.*)\}(.*)\{\/lang\}/U', $string, $results);

godza
28. 02. 2008., 00:20
Samo stavi modifier /U na kraju:

preg_match_all('/\{lang(.*)\}(.*)\{\/lang\}/U', $string, $results);

E, kul, radi. Šta radi to U na kraju?

This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by "?". It is not compatible with Perl. It can also be set by a (?U) modifier setting within the pattern or by a question mark behind a quantifier (e.g. .*?).

Našao sam. Hvala još jednom.

ivanhoe
28. 02. 2008., 05:03
ovaj U switch je php fora, postoji i standardniji nacin za ovo, a to je da dodas ? na greedy selektor(pises .+? ili .*?) i onda ce ti biti non-greedy. To ti radi i u perlu i javascriptu, a i omogucava da kombinujes greedy i non-greedy u istom izrazu..

Takodje, cisto da znas, regExp ne mora nuzno da bude ogradjen sa /, mozes da stavis bilo koji karakter, pa onda ne moras da escapujes / znake unutar patterna, ispadne malo citljivije, tipa |<a>.+?</a>| ti je isto sto i /<a>.+?<\/a>/

dinke
28. 02. 2008., 11:02
Ponavljamo se :)

http://www.devprotalk.com/showthread.php?p=42093#post42093

Inace, pre neko vece sam slao Blues-u ... U brojevima PHP architekta 03/2004 - 05/2004 izasli su sjajni tutorijali za RegExp, onako od osnova pa do vrlo naprednih stvari. Ne mogu da postavljam moje PDF-ove je su zasticeni sa mojim podacima, ali ako neko ima razbijenu verziju, mozda bi trebalo da postavi.

bluesman
28. 02. 2008., 13:11
Zato se blues i kurchi kao da zna nesto :) Pročitao sam članke :)

godza
28. 02. 2008., 14:03
Hvala josh jednom, ali mi opet treba help u vezi necega.

Imam ovaj string

$string= "
some_function('Svega ovoga ne bi bilo da pero nije otisao u policiju', array(
'parametar' => 1,
'metar' => 1,
'metarpara' => 1,
));
";

if ovaj pattern koji sam sklepao
$pattern = "/some_function\('([^'].*?)'.*?\)/is";

kada izvrsim preg_match_all dobijem

array(2) {
[0]=>
array(1) {
[0]=>
string(159) "some_function('Svega ovoga ne bi bilo da pero nije otisao u policiju', array(
'parametar' => 1,
'metar' => 1,
'metarpara' => 1,
)"
}
[1]=>
array(1) {
[0]=>
string(53) "Svega ovoga ne bi bilo da pero nije otisao u policiju"
}
}

Dakle dobio sam ono shto sam hteo tj: Svega ovoga ne bi bilo da pero nije otisao u policiju

Problem je ako je string
$string= "
some_function('Svega ovoga ne bi bilo da per\'o nije otisao u policiju', array(
'parametar' => 1,
'metar' => 1,
'metarpara' => 1,
));
";

(obratite paznju na escapeovani apostrof).

tada mi je rezultat: Svega ovoga ne bi bilo da per\

Kako da ispravim ovaj pattern da ne puca na escape-ovanju apostrofa, tj da mi vrati: Svega ovoga ne bi bilo da per'o nije otisao u policiju

misk0
28. 02. 2008., 14:57
Lupam... mozda moze bolje, ali da uradis jedan replace ('\', '') prethodno ako je samo \ problem?

godza
28. 02. 2008., 15:04
Mogu, ali ce opet da prsne preg_match_all i dobicu

Svega ovoga ne bi bilo da per a trebao bih Svega ovoga ne bi bilo da per'o nije otisao u policiju

ivanhoe
28. 02. 2008., 16:46
koristi ', array kao marker za kraj:
$pattern = "/some_function\('(.*?)', array/is";

akubra
28. 02. 2008., 17:16
Mozes da probas da uhvatis sve do prvog navodnika, koji nema \ ispred sebe:
$pattern = "/some_function\('(.*?[^\\\])'.*?\)/is";

godza
28. 02. 2008., 20:45
@ivanhoe
da, to bi bilo ok, ali array je opcioni parametar, pa ne mogu da se oslonim na njega :(

@akubra
Na prvi pogled, ovo bi trebalo da tradi, kada se dokopam kood-a, provericu, pa cu da javim.

xippi
02. 03. 2008., 17:33
U brojevima PHP architekta 03/2004 - 05/2004 izasli su sjajni tutorijali za RegExp, onako od osnova pa do vrlo naprednih stvari.


tnx for tip

http://www.sendspace.com/file/0fdmd7