Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Regexp - problem
Forum PHP.pl > Forum > PHP
bronchos
  1. <?php
  2. $text = "wiersz 1 - {IF 'alabama'=='ggg'}equal{ELSEIF 'alabama'=='hhh'}not 1{ELSEIF 'alabama'=='fff'}not 2{ELSE}not 3{ENDIF}";
  3.  
  4. preg_match('/({IF (.*?)}(.*?))({ELSEIF (.*?)}(.*?))*({ELSE}(.*?))?({ENDIF})/s',$text,$regs);
  5.  
  6. echo '<pre>';
  7. print_r($regs);
  8. echo '</pre>';
  9. ?>


Powyższy kod działa nie do końca tak, jakbym chciał. Zamiast wyłapać wszystkie powtórzenia "{ELSEIF ddd}ddd" łapie tylko ostatnie wystąpienie.

Innymi słowy, zamiast:
  1. Array
  2. (
  3. [0] => {IF 'alabama'=='ggg'}equal{ELSEIF 'alabama'=='hhh'}not 1{ELSEIF 'alabama'=='fff'}not 2{ELSE}not 3{ENDIF}
  4. [1] => {IF 'alabama'=='ggg'}equal
  5. [2] => 'alabama'=='ggg'
  6. [3] => equal
  7. [4] => {ELSEIF 'alabama'=='fff'}not 2
  8. [5] => 'alabama'=='fff'
  9. [6] => not 2
  10. [7] => {ELSE}not 3
  11. [8] => not 3
  12. [9] => {ENDIF}
  13. )


oczekuję rezultatu:
  1. Array
  2. (
  3. [0] => {IF 'alabama'=='ggg'}equal{ELSEIF 'alabama'=='hhh'}not 1{ELSEIF 'alabama'=='fff'}not 2{ELSE}not 3{ENDIF}
  4. [1] => {IF 'alabama'=='ggg'}equal
  5. [2] => 'alabama'=='ggg'
  6. [3] => equal
  7. [4] => {ELSEIF 'alabama'=='hhh'}not 1
  8. [5] => 'alabama'=='hhh'
  9. [6] => not 1
  10. [7] => {ELSEIF 'alabama'=='fff'}not 2
  11. [8] => 'alabama'=='fff'
  12. [9] => not 2
  13. [10] => {ELSE}not 3
  14. [11] => not 3
  15. [12] => {ENDIF}
  16. )


Macie może pomysł jak to zmienić?

Z góry dzięki,
MS
danek
Nie znam się na wyrażeniach, ale jeżeli chcesz wyciągnąć powtarzające się dane to użyj preg_match_all
Jeżeli dobrze widzę, to w tym momencie narzucasz strukturę if,elseif,else, więc powtórzenie elseif jest pomijane
bronchos
Niestety, preg_match_all mogło by posłużyć do wyłapania n powtórzeń całego wyrażenia, a nie jego części.
Nie tędy droga. Poza tym preg_match w tym przypadku to tylko przyklad zobrazowania idei.
Finalnie zamiast preg_match będzie preg_replace_callback.
danek
Ale to ma działać konkretnie z tym przykładem, czy z większą ilością możliwości?
Jeżeli tylko tu to dodaj do wyrażenie jeszcze 1 elseif, a jeżeli nie to ja bym to załatwił preg_match_all do ifów + preg_match do elsów.
Ogólnie jeżeli chcesz to zrobić w pregu, to musisz przewidzieć jakąś określoną max ilość elseif-ów
bronchos
Ma działać z nieokreśloną ilością ELSEIF (również 0) oraz z lub bez ELSE.
danek
Mogę się mylić, ale nie rozwiążesz tego w ten sposób.
Próbowałem dublować wpis elseif, próbowałem ograniczyć znaki (niedopuszczanie { ), ale to nic nie dało.
Wydaje mi się, że po prostu musisz do tego użyć jakiegoś preg_match_all albo czegoś podobnego i po prostu rozbić każdego if-a na elseify i else-y
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.