Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Regexp - problem
bronchos
post 4.11.2008, 22:13:55
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 16.03.2007

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


  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
Go to the top of the page
+Quote Post
danek
post 4.11.2008, 22:17:16
Post #2





Grupa: Zarejestrowani
Postów: 48
Pomógł: 1
Dołączył: 1.02.2004
Skąd: warszawa

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


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

Ten post edytował danek 4.11.2008, 22:20:53


--------------------
E-Danek.info
Go to the top of the page
+Quote Post
bronchos
post 4.11.2008, 22:26:20
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 16.03.2007

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


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.
Go to the top of the page
+Quote Post
danek
post 4.11.2008, 22:30:40
Post #4





Grupa: Zarejestrowani
Postów: 48
Pomógł: 1
Dołączył: 1.02.2004
Skąd: warszawa

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


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


--------------------
E-Danek.info
Go to the top of the page
+Quote Post
bronchos
post 4.11.2008, 22:33:35
Post #5





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 16.03.2007

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


Ma działać z nieokreśloną ilością ELSEIF (również 0) oraz z lub bez ELSE.
Go to the top of the page
+Quote Post
danek
post 4.11.2008, 22:43:31
Post #6





Grupa: Zarejestrowani
Postów: 48
Pomógł: 1
Dołączył: 1.02.2004
Skąd: warszawa

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


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


--------------------
E-Danek.info
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 Wersja Lo-Fi Aktualny czas: 23.06.2025 - 19:06