![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 1.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
Jak to dziala? Probowalem napisac parser z wykorzystaniem ale ogolnie dostaje tylko puste wyniki. Mam taki kod..
Probowalem sie opierac na przykladzie z manualu, ale ze za dobrze akurat rekursywnosc tam opisana nie jest to tez nie wiem do konca co robie. Na pewno jest to cos zwiazane z druga linijka $regexa, bo jak to zamienie na (.*) to zwraca wyniki tak jak powinno. Oczywiscie bez rekursywnosci, wiec jak dla mnie to bezuzyteczne.. Babral sie ktos w tym kiedys? Ten post edytował Blodo 31.12.2007, 00:06:42 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
Mniej więcej takie wyrażenie jest w manualu ( trochę je zmieniłem, bo to z manuala sypałoby się przy pustych tagach: [inddent][/inddent] ):
Cytat $regex = '#\[inddent\]((?:[^\[]|\[(?!/?inddent\])|(?R))*)\[/inddent\]#'; \[inddent\] - Najpierw szukamy naszego tagu początkowego. Następnie dajemy alternację, która spróbuje dopasować... [^\[] - ...jakieś znaki, które nie są nawiasem kwadratowym otwierającym. Jesli się to nie uda, czyli trafiła na "["... \[(?!/?inddent]) - ... to próbuje dopasować ciąg znaków znajdujący się za nim do tagu BBcode innego niż "[inddent]" i "[/inddent]" (tzw. 'przewidywanie negatywne'). Jeśli to dopasowanie tez zawiedzie, to mamy do czynienia z tagiem [inddent] lub [/inddent], tylko jeszcze nie wiemy którym. ... (?R) - ... Próbujemy teraz dopasować w to miejsce całe nasze wyrażenie używając rekurencji. Jeśli to też sie nie powiedzie, to znaczy że znaleziono tag kończący: \[/inddent\] Oczywiście we wnętrzu tagu [inddent] [/inddent] mogą znajdować się jakieś znaki, za nimi inny tag BBcode, potem znowu jakieś znaki, a dopiero na końcu zagnieżdżony tag [inddent] [/inddent]. Dlatego całą alternację musimy wykonać wiele razy, stawiają zaraz za nią metaznak: * W twoim przypadku: \[inddent\] to będzie <!--\\s*(.*?)\\s*--> \[/inddent\] to bedzie <!--\\s*/\\1\\s*--> \[(?!/?inddent\]) to będzie <!--(?!\\s*/?\\1\\s*-->) \[ to bedzie < ! Wszystkie tagi [ indent] zamieniłem na [inddent] Ten post edytował Kicok 2.01.2008, 11:58:08 -------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 1.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dzieki za wytlumaczenie, wszystko dziala
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 21:51 |