Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [regex] Wyłączanie całego wyrazu z wyrażenia
Forum PHP.pl > Forum > PHP
Zakrn
Eh... wysiadam. :cry: Próbuję wymęczyć pewne wyrażenie regularne.
Kod
/<poczatek>(.*)</koniec>/Us

Chodzi o to, żeby powyższe wyrażenie nie dopasowywało ciągów, w których pomiędzy tagami <poczatek> i </koniec> wystapi znów tag <poczatek>. Próbowałem wszystkich sposobów, ale nie wiem jak wyłączyć z ciagu cały wyraz, a nie pojedyńcze znaki.
Pomóżcie, proszę!
zulus
też miałem ten problem biggrin.gif . Oto rozwiązanie:
[php:1:2a0309cc3a]<?php
$text = '1 slowo [ php ]1 kod[ /php ] 2 slowo [ php ]2 kod[ /php ] 3 slowo';
preg_match_all("#
  1. <?php
  2. (.*?)
  3. ?>
#i", $text, $matches);
print_r($matches);
?>[/php:1:2a0309cc3a]


Wynik jest w tablicy $matches...
Poczytaj jeszcze o samej funkcji preg_match_all, bo ma opcjonalny parametr który często się przydaje...
?>[/php]
Zakrn
Hm... nie całkiem o to mi chodziło. To faktycznie działa w takim przypadku, jaki ty podałeś, ale tylko kiedy jedno [ php ] nie jest zagłebione w drugim.
Chodzi o to, zeby w takim na przykład kodzie:
[xml:1:77b8cfc704]<ztpl:if condition="1">
kod 1
</ztpl:if><ztpl:else>
<ztpl:include element="category_hidden" />
<ztpl:if condition="1">
kod 2
</ztpl:if><ztpl:else>
kod 3
</ztpl:else>
kod 4
</ztpl:else>[/xml:1:77b8cfc704]
Wyszukało najpierw to wewnętrzne if (które nie zawiera w sobie żadnego innego), wykonało odpowiednią fukcję, a póżniej wyszukało kolejne, wyższe w hierarchi. Kiedy używam tak jak napisałeś:
[php:1:77b8cfc704]<?php
preg_match_all('/<ztpl:if condition="(.*?)">(.*?)</ztpl:if><ztpl:else>(.*?)</ztpl:else>/Us', $tmp_el, $commands_m, PREG_SET_ORDER);
?>[/php:1:77b8cfc704]
lub bez U, to dopasowuje mi wyrażenie nie całkiem tak jak powinno - sprawdź zresztą sam.
Chodzi mi konkretnie o wyłączenie całego wyrazu z wyrażenia. Ma ktoś jeszcze jakiś pomysł?
Zakrn
Nikt nic nie wie na ten temat? To jest mi naprawdę potrzebne...
bamboos
Witam!!
Może tu coś znajdziesz, bo problem był podobny:
http://forum.php.pl/viewtopic.php?t=6041
kubatron
niewiem może masz link do manuala ale podam
http://pl.php.net/manual/pl/function.ereg-replace.php
Zakrn
bamboos << Problem był podobny, ale mi chodzi o wyciaganie tego przez preg_match_all i późniejszą zamianę, próbowałem to co podałeś przerobić... ale niezbyt chciało wychodzić.
kubatron << Znam manual 8) . Część o wyrażeniach też. 8)

Ale wykombinowałem. Trochę na odwrót i dłużej, ale się udało:
[php:1:4a776f80c8]<?php
preg_match_all('/<ztpl:if condition="(.[^"]*?)">((?(?=.*<ztpl:if.*).[^ztpl:if]*|.*))</ztpl:if><ztpl:else>((?(?=.*<ztpl:if.*).[^ztpl:if]*|.*))</ztpl:else>/Us', $tmp_el, $commands_m, PREG_SET_ORDER);
?>[/php:1:4a776f80c8]
Zastsosowałem wyrażenie warunkowe (?(?=...)...|...) i nawet działa dobrze biggrin.gif
Dzięki wszystkim!
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.