ďťż

[PHP] Kwantyfikatory w PCRE zachłanny i niezachłanny

       

Podstrony


telcocafe

Dodaję funkcję kolorowania składni do skryptu. Postanowiłem automatycznie zamieniać kod wewnątrz <pre> i <code> na encje. Może to nie najlepszy sposób, ale ręczna zamiana kodu na encje i późniejsza edycja takiego jest uciążliwa.

Przykład:<pre> <b>Jakiś tam kod</b> <pre>inny znacznik PRE</pre> </pre> Dalsza część artykułu <pre><i>Kolejny przykład kodu</i></pre>
Oczywiście zawartość <pre> ma być widoczna jako kod źródłowy, więc < i > trzeba zamienić na &lt; i &gt;

Kod, który stosuję:$tekst = preg_replace( array( '#<(pre)([^>]*)>(.*?)</pre>#sie', '#<(code)([^>]*)>(.*?)</code>#sie' ), '"<\\1\\2>".htmlspecialchars("\\3",0)." </\\1>"', $tekst);
Zastosowałem kwantyfikator niezachłanny .*? jednak to wyrażenie regularne polegnie na tym przykładzie, ponieważ wewnątrz <pre> znajduje się kolejny znacznik <pre> (który już powinien zostać zamieniony na encje, ale tak się nie dzieje).

Do edycji kodu stosuję podobny kod, lecz htmlspecialchars_decode() zamiast htmlspecialchars().

Nie mogę użyć kwantyfikatora zachłannego .* gdyż takich przykładów (bloków) <pre> może być obok siebie dużo w artykule. Gdyby był tylko 1, nie byłoby problemu.

Wiem, jak rozwiązać problem przy użyciu standardowych funkcji do ciągów tekstowych - str_* - jednak trzeba pisać znacznie więcej kodu. Czy istnieje takie wyrażenie regularne, które:

1. Znajdzie wszystkie <pre> i <code> i zamieni w środku kod na ENCJE
2. Nie będzie wyszukiwać <pre> i <code> wewnątrz innych <pre> i <code>.

PS. Znak ' jest zamieniany na /' mimo że opcja magic_quotes jest wyłączona.



geshi, dp.syntaxhighlighter z gotowych, popatrz jak np. w skryptach for rozwiązany jest tag "code". Najlepsze podejście do programowania to KISS, a nie wynajdywanie koła na nowo w formie kanciastej z ołowiu.

A jak piszesz o kwantyfikatorach i liczysz na odpowiedzi to powinieneś to wrzucić co najmniej na forum.php.pl... choć chyba tam też już mało kto chce Ciebie czytać ;)
Użytkownik Riklaunim edytował ten post 12 luty 2010, 23:51
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.