2017-02-27 2 views
0

Hilfe bei einer Regex beginnt. Ich habe eine große Reihe von HTML und muß Tags entfernen ähnlichenPHP Regex Hilfe, Entfernen einer Zeichenfolge, die mit [caption id =

[caption id="attachment_24612" align="alignnone" width="900"] 

Jeden Tag die gleichen [caption id= beginnt und endet die gleichen ] ... aber etwas in der Mitte ist wird jedes Mal eindeutig sein. Der Regex-Code soll in etwa so aussehen, aber ich weiß nicht, wie Muster in der Mitte passen

$sourceHTML = preg_replace(array("[caption id=", ""),"", $sourceHTML); 

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Verwenden Sie stattdessen:

$sourceHTML = preg_replace("/\[caption id=(.*?)\]/", "", $sourceHTML); 
+0

bearbeitet zu verwenden (. *?) Statt (. *) Unbeabsichtigte Ersatz – Hossam

+0

RegexMuster zuerst Niitaku des Musters ist die diese Antwort zu vermeiden minderwertig. Hinweis: '\ sid =' und die Fanggruppe '()' sind unnötig. Niitakus erfolgreiches Muster verwendet nur 11 Schritte (~ 0 ms) gegenüber dieser Antwort, die 113 Schritte (~ 29 ms) verwendet. – mickmackusa

+0

perfekt! Danke vielmals. –

2

Um diese Beschriftung Tags zu löschen, können Sie diese Regex verwenden können:

\[caption[^]]+] 

See the demo

Wenn Ihre Tags auf einzelne Zeile und Sie Möchten Sie die leere Zeile entfernen, die die vorherige Regex verlassen kann, verwenden Sie diese:

\[caption[^]]+]\R? 

Der Teil \R? stimmt mit möglichen neuen Zeilenzeichen direkt nach dem Tag überein.

See the demo

Beispiel

$sourceHTML = preg_replace("/\[caption[^]]+]\R?/", "", $sourceHTML); 
+0

Das Top-Muster ist extrem schlank. Eine Qualitätserschaffung. Die Suche nach "einer oder mehreren nicht schließenden eckigen Klammern" (11 Schritte, ~ 0 ms) übertrifft einen "nicht gierigen ein-oder-mehr-Punkt" (62 Stufen, ~ 4 ms), da die Engine nur gegen eine Liste mit 1 prüfen muss Zeichen im Gegensatz zu vielen Zeichen, die ein Punkt darstellt. Ich werde diese Optimierung in Zukunft verwenden. +1 für die beste Logik – mickmackusa

Verwandte Themen