2017-05-30 5 views
1

Ich versuche bbcodes in Texten mit REGEX zu identifizieren.Regex vom letzten Vorkommen eines Tags starten

Ich habe den folgenden Text:

Lorem ipsum dolor sit amet, [color] consectetur adipisicing el it labore et [color=red]dolore magna aliqua[/color] minim veniam. 

Und zur Zeit verwende ich dieses Muster:

/\[([a-z0-9]+).+?\[\/\1\]/i 

Aber es fängt diese:

[color] consectetur adipisicing el it labore et [color=red]dolore magna aliqua[/color] 

statt dessen:

[color=red]dolore magna aliqua[/color] 

Ich denke an zwei Lösungen, aber ich weiß nicht, wie es funktioniert:

  1. Not inside Tag-Inhalt ermöglicht Tags. Dann, [b]this [b] won't be allowed[/b];
  2. Starten des Musters vom letzten Tag Auftreten.

Danke für die Hilfe,

JG

Antwort

1

Ihre Regex finden die am weitesten links stehende Auftreten von [ durch den BBtag gefolgt, und dann .+? Matches all 1+ Zeichen außer Zeilenumbruch, so wenig wie möglich, aber so viele wie nötig, um die am weitesten links [/<CLOSE_TAG>] zu finden.

Sie müssen sicherstellen, dass Sie auf dem Weg zum Schließen des Starttag nicht übereinstimmen ein:

\[([a-z0-9]+)[^\[]*(?:\[(?!\1\b)[^\[]*)*?\[\/\1\] 

Siehe regex demo

Es ist fast die gleiche wie \[([a-z0-9]+)(?:(?!\[\1\b).)+?\[\/\1\], die ein bisschen sein könnte lesbarer, aber weniger effizient.

Einzelheiten:

  • \[ - eine offene Klammer
  • ([a-z0-9]+) - Gruppe 1 (Tag-Name): 1+ alphanumerische Symbole
  • [^\[]* - null oder mehr Zeichen andere als [
  • - 0+ Sequenzen (so wenig wie möglich) passend
    • \[(?!\1\b) - a [ nicht mit Gruppe 1 Text als ganzes Wort gefolgt
    • [^\[]* - null oder mehr Zeichen außer [
  • \[ - a [
  • \/ - a /
  • \1 - Text der Gruppe 1
  • \] - a ].
+1

WOW! Danke vielmals! Es hat perfekt funktioniert! Ich habe versucht, einen Fall zu finden, dass es nicht funktioniert, aber ich konnte niemanden finden :-) Super! Vielen Dank! –

Verwandte Themen