Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zachłanne wyrażenie regularne
Forum PHP.pl > Forum > PHP
eccocce
Witam,
Mam taki kod:
  1. {#<table cellpadding="0" cellspacing="0">
  2. <tr>
  3. <th>Moduły</th>
  4. <th></th>
  5. </tr>
  6. </thead>
  7. {<tr>
  8. <td>%modul%</td>
  9. <td></td>
  10. </tr>}
  11. </tbody>
  12. </table>#}

Chciałbym z niego wyciągnąć przy użyciu preg_match kawałek { ... %modul% ... } , więc używam kodu:
  1. if(preg_match('#\{(.*?)%modul%(.*?)\}#s', $content, $matches))
  2. {
  3. ...
  4. }

Niestety zamiast oczekiwanego:
  1. {<tr>
  2. <td>%modul%</td>
  3. <td></td>
  4. </tr>}

dostaję:
  1. {#<table cellpadding="0" cellspacing="0">
  2. <tr>
  3. <th>Moduły</th>
  4. <th></th>
  5. </tr>
  6. </thead>
  7. {<tr>
  8. <td>%modul%</td>
  9. <td></td>
  10. </tr>}

Co mnie bardzo dziwi, ponieważ zastosowałem "?" który miał sprawić, że dopasowanie nie będzie greedy ale będzie lazy tongue.gif
Może ktoś ma pomysł, co robię źle? smile.gif
Pozdrawiam

PS: jest to część funkcji w prostym systemie szablonów (nie chcieliśmy wrzucać kombajnów typu smarty do naszych małych zastosowań)
wookieb
Spróbuj
Kod
#\{([^{]*?)%modul%([^}]*?)\}#s
rzymek01
cały ten kod także spełnia podane kryteria, po zastosowaniu preg_match_all powinieneś mieć i ten większy i mniejszy fragment
eccocce
preg_match_all niestety nie pomógł, ale za to rozwiązanie wookieb zdało egzamin ;] Pytanie tylko dlaczego, skoro w przypadku niezachłannym wyrażenie powinno złapać najkrótsze dopasowanie... czy się mylę?
cycofiasz
Ale chyba wyrażenie dopasowuje od lewej do prawej, a niezachłanność zadziałała bo zatrzymała dopasowanie na piewszym napotkanym } a nie tym na końcu
wookieb
Cytat(eccocce @ 13.07.2011, 21:23:13 ) *
Pytanie tylko dlaczego, skoro w przypadku niezachłannym wyrażenie powinno złapać najkrótsze dopasowanie... czy się mylę?

Nie najkrótsze, ma skończyć dopasowywać kawałek wzorca kiedy to tylko możliwe.
W twoim przypadku złapał pierwsza klamrę i rzeczywiście skończył dopasowywać przy najbliższej napotkanej okazji. To, że przy okazji złapał { to nie jest wina. Kazałeś mu dopasować każdy znak.
Dlatego w moim wyrażeniu jest jasno podane. Dopasuj wszystkie znaki poza {.

Zachłanność miałaby znaczenie gdybyś miał na coś takiego
Kod
{ %modul% cos tam %modul%

eccocce
Dzięki wookieb. Przydało mi się małe odświeżenie tematu wyrażeń regularnych smile.gif Pozdrawiam
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.