| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Erfahrener Benutzer Registriert seit: 06.11.2008
Beiträge: 212
![]() | Moinsen, mit Hilfe von diesem Artikel: BBCode-Parser mit noparse-Tag selbst gemacht - Developer's Guide habe ich ich mir mein eigenen BBCode Parser gebastelt. Den großen RegExp habe ich fast 1:1 übernommen. Das Problem ist nun allerdings, das er bei bestimmten BBCodes den Apache totschiest. Also der RegExp: Code: #\[(\w+)((?:\s|=|:)[^]]*)?]((?:[^\[]|[(?!/?\1((?:\s|=|:)[^]]*)?])|(?R))*)\[/\1]# Code: [list][listelement]liste 1[/listelement][listelement]liste 2[/listelement][/list] Hat jemand vielleicht eine Lösung für mein Problem? Gruß Benny |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer | Was genau bedeutet "zerschießen"? Steigts mit einem SegFault aus? Wenn ja: Sind die installierten Versionen aktuell? Wenn Ja: Bug erfassen auf Php.net
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Da würde ich das letzte ] auch escapen. Das: !/ weiss ich nicht, was das da soll Das: \1 ist imho falsch, weil Du ja Subelemente auch anderer Tags (nicht) matchen willst
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |||
| Erfahrener Benutzer | Ist nicht nötig. Wenn kein öffnendes (oder ein maskiertes) [ vorhanden ist, bleibt ] ohne Wirkung. Zitat:
Zitat:
Der reguläre Ausdruck selbst ist aufgrund dem vorhanden sein von einer schließenden Klammern, die keine zugehörige öffnende Klammer hat, nicht ganz richtig. Ausschnitt aus der letzten Alternative: Code: (?R))*)
^
| ||
| | |
| | ||
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Zitat:
Gerade /? versehe ich an dem Ausdruck nicht. Prüfung auf schliessendes Tag wäre ja ok, aber ein weiteres öffnendes? Wäre der Ausdruck ungreedy würde zudem das erste schliessende Komplement sowieso durch das abschliessende \1 abgedeckt.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- | |
| | |
| | ||
| Erfahrener Benutzer | Er prüft deswegen auch auf zugehörige öffnende Tags, um die Verschachtelung korrekt zu handhaben. Wird ein weiterer zugehöriger öffnender Tag gefunden, wird zur nächsten Alternative gesprungen, in welcher der gesamte reguläre Ausdruck nochmal aufgerufen wird (und wenn wieder öffnende Tags gefunden wieder. Und dann wieder. Und dann wieder :p). Betrachten wir das etwas näher am indent-Beispiel der Funktionsreferenz zu preg_replace_callback. Gegeben ist "plain[indent] deep[indent] deeper [/indent]deep [/indent]plain". Der zugehörige reguläre Ausdruck ist \[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]. Das Matching startet beim ersten[indent], dann geht’s weiter bis zum nächsten [. Es ist ein zugehöriger öffnender Tag, die nächste Alternative wird durchgeführt in welcher der Ausdruck nochmal rekursiv aufgerufen wird. Wieder wird[indent] gematcht, es geht wieder bis zum nachfolgenden [. Diesmal ist es ein zugehöriger schließender Tag, es wird eine erneute Rekursion durchgeführt, die erfolglos ist, da es kein[indent] ist. In der aktuellen, ersten Rekursion sind nun alle Alternativen abgearbeitet, das [/indent]wird gematcht, und die erste Rekursion war auf „[indent] deeper [/indent]“ erfolgreich. Nun sind wir wieder im „Hauptlauf“ – die dritte Alternative, also der erste rekursive Aufruf war erfolgreich also geht es weiter, bis zum nächsten [ - das ist das letzte [/intent] im String. Wieder rekursiver Aufruf, dieser schlägt fehl, es geht weiter im „Hauptlauf“ mit dem schließenden [/indent]und der reguläre Ausdruck ist komplett abgearbeitet. Zitat:
Geändert von Mati_ (05.08.2009 um 04:00 Uhr). | |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Da muss ich morgen noch mal drüber nachdenken. Aber cool, ?R kannte ich noch gar nicht.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| Erfahrener Benutzer | Ja, das würde ich auch empfehlen ;). Die Sache ist dann mmn. schon wirklich das komplexeste was reguläre Ausdrücke zu bieten haben (gut, in Perl geht's dann noch extremer, da man damit wirklich *alles* machen kann). Muss man sich aufjedenfall über einen längeren Zeitraum mal durch den Kopf gehen lassen. Achso - bzgl. (?R) - es gibt auch (?<num>) wobei <num> sich auf den Inhalt einer einfangenden Klammer bezieht. Praktisch, wenn der Rekursiv-Teil nur ein Teil eines größeren regulären Ausdruckes ist. Aber man muss sagen, ich verwende diese Elemente eigentlich nie. Geändert von Mati_ (05.08.2009 um 04:35 Uhr). |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Regexp BBCode Listen | stayInside | PHP-Fortgeschrittene | 4 | 15.07.2009 00:47 |
| GeSHi BBCode wird beim zweiten Mal nicht angezeigt | Ti-Systems | PHP Tipps 2009 | 4 | 27.05.2009 16:59 |
| [Erledigt] Eigener BBCode mit mehreren Optionen - Fehler | Arego | PHP Tipps 2009 | 8 | 09.03.2009 18:00 |
| Scriptsuche RegExp: TelNrn aus String extrahieren | scream479 | Scriptbörse | 1 | 04.09.2008 17:08 |
| BBCode - ähnliche Markup-Language für Redaktionssystem | horstenpeter | PHP Tipps 2006 | 3 | 17.08.2006 18:44 |
| BBCode mit eregi_replace(); ändert nur letztes Vorkommen | Blank | PHP Tipps 2006 | 6 | 12.04.2006 14:58 |
| [Erledigt] REGEXP und Collations | Datenbanken | 2 | 14.03.2006 14:22 | |
| BBCode Parser | Mutatos | PHP Tipps 2006 | 1 | 05.01.2006 12:19 |
| BBCode Realisierung - Code | Andun | PHP-Fortgeschrittene | 10 | 18.12.2005 21:09 |
| [Erledigt] Problem mit BBCode | PHP Tipps 2007 | 6 | 30.11.2005 17:26 | |
| [Erledigt] [RegExp] Thema BBCode und XHTML 1.1 | PHP-Fortgeschrittene | 2 | 18.09.2005 13:57 | |
| BBCode umwandeln | GSJLink | PHP Tipps 2005-2 | 7 | 13.08.2005 16:29 |
| bbcode verachtet anderen bbcode | phpfortgeschrittener | PHP Tipps 2005-2 | 7 | 04.08.2005 00:42 |
| BBCode - Listen und Tabellen | inu | PHP Tipps 2005 | 11 | 22.03.2005 10:37 |
| BBCode und htmlspecialchars | PHP Tipps 2005 | 5 | 21.02.2005 20:10 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| regex zugehörige tags, regexpbbcode, preg_replace_callback noparse, regexp bbcode, bb code alternative, bbcode alternative |