php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.08.2009, 13:13  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard RegExp BBCode

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]#
Sobald der BBCode wie folgt aussieht:

Code:
[list][listelement]liste 1[/listelement][listelement]liste 2[/listelement][/list]
haut der den Apache rund über Kopp.

Hat jemand vielleicht eine Lösung für mein Problem?

Gruß
Benny
stayInside ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.08.2009, 16:13  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

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
mepeisen ist gerade online   Mit Zitat antworten
Alt 04.08.2009, 16:14  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Als erstes würde ich empfehlen, statt [^]] immer [^\]] zu verwenden.

Und hier, was macht der dort
Code:
((?:[^\[]|[(?!/?\1((?:\s|=|:)[^]]*)?])|(?R))*)
          ^
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 04.08.2009, 16:26  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Als erstes würde ich empfehlen, statt [^]] immer [^\]] zu verwenden.

Und hier, was macht der dort
Code:
((?:[^\[]|[(?!/?\1((?:\s|=|:)[^]]*)?])|(?R))*)
          ^
Den Fehler hatte ich beim Testen auch schon behoben, jedoch ohne Erfolg.

Was mir aufgefallen ist, wenn ich die Delimitter von # auf ° ändern, stürzt Apache zwar nicht ab, aber der Parser erkennt dann auch nichts mehrs.

Edit: hab den übeltäter gefunden:

Code:
|\[(?!/?\1((?:\s|=|:)[^\]]*)?])
Dieser Abschnitt macht Probleme, ich denke bis morgen werden damit fertig sein xD

Geändert von stayInside (04.08.2009 um 16:30 Uhr).
stayInside ist offline   Mit Zitat antworten
Alt 04.08.2009, 17:07  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

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.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.08.2009, 00:24  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Da würde ich das letzte ] auch escapen.
Ist nicht nötig. Wenn kein öffnendes (oder ein maskiertes) [ vorhanden ist, bleibt ] ohne Wirkung.
Zitat:
Das: !/ weiss ich nicht, was das da soll
Das Rufzeichen ist Teil des Beginns eines negativen Lookaheads, das / dann wieder ein optionales Zeichenliteral.
Zitat:
Das: \1 ist imho falsch, weil Du ja Subelemente auch anderer Tags (nicht) matchen willst
Bei Lookarounds wird nichts gematcht. In diesem Fall wird bei dieser Alternative nur geprüft ob ein weiteres, bzw. schließendes Tag von dem aktuell gematchtem [ aus vorhanden ist, und wenn ja, wird zur nächsten Alternative gesprungen, wenn nein, ist die Alternative erfolgreich, und der Matching-Vorgang beginnt aufgrund des +-Quantifiers wieder am Anfang der Gruppe. Solange bis alle Alternativen einmal fehlschlagen.

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))*)
      ^
Mati_ ist offline   Mit Zitat antworten
Alt 05.08.2009, 00:38  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Bei Lookarounds wird nichts gematcht. In diesem Fall wird bei dieser Alternative nur geprüft ob ein weiteres, bzw. schließendes Tag von dem aktuell gematchtem [ aus vorhanden ist, und wenn ja, wird zur nächsten Alternative gesprungen, wenn nein, ist die Alternative erfolgreich,
Naja, schon klar. Ich weiss kein anderes Wort dafür. Intern matcht der Ausdruck erstmal schon den Teilausdruck, um dann festzustellen: Ist Teil eines negativen Lookaround und fällt damit weg.
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.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.08.2009, 03:53  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

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:
Wäre der Ausdruck ungreedy würde zudem das erste schliessende Komplement sowieso durch das abschliessende \1 abgedeckt.
Naja, dass soll es aber bei verschachtelten Tags nicht - bei [b]a[b]b[/b]c[/b] soll der "a[b]b[/b]c"-Teil und nicht "a[b]b" gematcht werden.

Geändert von Mati_ (05.08.2009 um 04:00 Uhr).
Mati_ ist offline   Mit Zitat antworten
Alt 05.08.2009, 04:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

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.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.08.2009, 04:31  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

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).
Mati_ ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ä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

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:47 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum