Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Regex
Forum PHP.pl > Forum > PHP
Crozin
Witajcie... mam drobny problem - mam string:
Kod
  {foreach from=$From item=Item key=$Key}
    da
      {foreach 2222}
       adasdas
      {/foreach }
    dsdas
  {/foreach}

(jak sie zapewne domyslacie do systemu szablonow tongue.gif)
mamy tylko 1 problem z tym... proste wyr. reg. jakim to "wypaluje:
  1. <?php
  2. preg_match_all('|{ *foreach +([^}]+) *}(.*){ */ *foreach *}|si', $this->Unparsed, $Out);
  3. ?>


niestety wybiera mi ono takie cos:
Kod
Array
(
    [0] => Array
        (
            [0] => {foreach from=$From item=Item key=$Key}
    da
      {foreach 2222}
       adasdas
      {/foreach }
    dsdas
  {/foreach}
        )

    [1] => Array
        (
            [0] => from=$From item=Item key=$Key
        )

    [2] => Array
        (
            [0] =>
    da
      {foreach 2222}
       adasdas
      {/foreach }
    dsdas
  
        )

)

nie bardzo wiem jak zrobic aby wybieralo kazda pare foreach :/
Zeman
Zgaduję co chce Pan dostać i niech Pan najpierw potwierdzi czy tak ma być :

  1. <?php
  2. {foreach from=$From item=Item key=$Key}
  3. da
  4. {foreach 2222}
  5.  adasdas
  6. {/foreach }
  7. dsdas
  8. {/foreach}
  9. ?>


Znalezienie 1:

{foreach from=$From item=Item key=$Key}
da
{foreach 2222}
adasdas
{/foreach }
dsdas
{/foreach}

podznalezienie 1.1 :
from=$From item=Item key=$Key

podznalezienie 1.2 :
{foreach 2222}
adasdas
{/foreach }




Znalezienie 2:

{foreach 2222}
adasdas
{/foreach }


podznalezienie 2.1 :
2222
podznalezienie 2.2 :
adasdas

Tak ma szukać ?
Crozin
Tak smile.gif
Zeman
No to musi Pan to zrobić rekurencyjnie bo jedno wywołanie regularnych nie podoła, choćby dlatego, że musiałoby zwracać 2 wyniki z tego samego fragmentu tekstu a regularne tak nie robią.

Jak już wyciągnie Pan

podznalezienie 1.2 :
{foreach 2222}
adasdas
{/foreach }

to na takim rezultacie trzeba wywołać jeszcze raz. Jeśli chodzi o templejty to akurat może to się skończyć obciążaniem serwera. Można niby próbować optymalizować że będzie jedno wywołanie reg. a reszta "ręcznie", jest takie coś jak preg_replace_callback i tam się podaje jako parametr funkcję.... można też to wykorzystać ale czy się opłaca to trzeb aby sprawdzić w praktyce.

$t);
  1. <?php
  2. $i = 0;
  3. $t = '[ bc [ bc ] ] e ';
  4.  
  5. function pr($matches) {
  6. global $i;
  7. if ($matches[0]=='[') $i++;
  8. if ($matches[0]==']') $i--;
  9. echo '( '.$i.': '.$matches[0].' )<br />';
  10. }
  11.  
  12. preg_replace_callback('/([)|(])/U', pr, $t);
  13. ?>


to mniej więcej jest tym co miałem na myśli z ręczną obsługą
Crozin
Dzięki za pomoc, ale postanowilem podejść do sprawy inaczej :]
Teraz wlaściwie mamy tylko jedno wyr.reg. które pobiera wszystko spomiędzy { a }:
  1. <?php
  2. preg_replace_callback('|{([^}]*)}|si', Array(__CLASS__, 'Parse'), $this->Template);
  3. ?>

jak to działa potem - nie bedę się rozpisywać bo to nieco nie na temat :]
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.