Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Regex
Crozin
post
Post #1





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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 :/

Ten post edytował Crozin 9.04.2007, 17:10:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Zeman
post
Post #2





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 29.03.2007

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


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ć ?
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Tak (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Zeman
post
Post #4





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 29.03.2007

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


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ą
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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 :]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:50