PHP-Regex, um außerhalb von HTML-Tags zu passen

Ich mache eine preg_replace auf HTML-Seite. Mein Muster zielt darauf ab, einigen Wörtern in html ein umgebendes Etikett hinzuzufügen. Manchmal ändert mein regulärer Ausdruck jedoch HTML-Tags. Zum Beispiel, wenn ich versuche, diesen Text zu ersetzen:

yasar 

Damit yasar yasar liest, ersetzt mein regulärer Ausdruck auch yasar im alt-Attribut des anchor-Tags. Aktuelle preg_replace() ich verwende, sieht so aus:

 preg_replace("/(asf|gfd|oyws)/", '${1}',$target); 

Wie kann ich einen regulären Ausdruck erstellen, so dass nichts mit einem HTML-Tag übereinstimmt?

Solutions Collecting From Web of "PHP-Regex, um außerhalb von HTML-Tags zu passen"

Sie können dafür eine Assertion verwenden, da Sie nur sicherstellen müssen, dass die gesuchten Wörter irgendwann nach einem > oder vor einem < . Letzterer Test ist leichter zu bewerkstelligen, da Lookahead Assertions variable Länge haben können:

 /(asf|foo|barr)(?=[^>]*(< |$))/ 

Siehe auch http://www.regular-expressions.info/lookaround.html für eine schöne Erklärung dieser Assertionssyntax.

Yasar, diese Frage wieder auferstehen lassen, weil sie eine andere Lösung hatte, die nicht erwähnt wurde.

Anstatt nur zu prüfen, ob das nächste Tag-Zeichen ein öffnendes Tag ist, überspringt diese Lösung alle .

Mit all den Disclaimern über die Verwendung von Regex zum Parsen von HTML, hier ist die Regex:

 < [^>]*>(*SKIP)(*F)|word1|word2|word3 

Hier ist eine Demo . Im Code sieht das so aus:

 $target = "word1 word2 again word3"; $regex = "~< [^>]*>(*SKIP)(*F)|word1|word2|word3~"; $repl= '\0'; $new=preg_replace($regex,$repl,$target); echo htmlentities($new); 

Hier ist eine Online-Demo dieses Codes.

Referenz

  1. Wie man Muster anpasst, außer in den Situationen s1, s2, s3
  2. Wie man ein Muster anpasst, wenn …

Dies könnte die Art von Sache sein, nach der Sie suchen: http://snipplr.com/view/3618/ Im Allgemeinen würde ich davon abraten. Eine bessere Alternative besteht darin, alle HTML-Tags zu entfernen und stattdessen auf BBcode zu setzen, wie zum Beispiel:

 [b]bold text[b] [i]italic text[i] 

Ich schätze jedoch, dass dies mit dem, was Sie versuchen, nicht gut funktioniert.

Eine weitere Option ist HTML Purifier, siehe: http://htmlpurifier.org/

Von ganzem Herzen sollte das funktionieren:

 echo preg_replace("/< (.*)>(.*)< \/(.*)>/i","< $1>$2",$target); 

Aber ich weiß nicht, wie sicher das wäre. Ich stelle nur eine Möglichkeit vor 🙂