2016-03-24 12 views
0

Das nervt mich den ganzen Tag. diese einfache HTML nicht gültig sei angenommenPHP Multibyte Regex zum Suchen und Ersetzen inner html benötigt

<p clneck="something">my neck hurts</p> 

Nun möchte Ich mag preg_replace verwenden zu ersetzen neck mit head

Natürlich einfach ein

preg_replace("/neck/", "head") 

würde mir geben

<p clhead="something">my head hurts</p> 

Ich denke mal du hast es erfasst.

Ich habe versucht, das Build in DOMDocument, aber es zweimal fehlgeschlagen: Es ist nicht für HTML5 gebaut und es noch fehlgeschlagen auf einigen himmlischen geschachtelten Tags.

+0

Wie ist es gescheitert? Was hast du versucht? Warum wurde "Arsch" mit dieser Regex "Kopf"? Diese sind auch keine Multibyte-Zeichen. – chris85

+1

Zuerst prüfen, wie man [preg_replace] (http://www.tutorialspoint.com/php/php_preg_replace.htm) verwendet. Sie vermissen den dritten Parameter. @ chris85: Ich habe die Frage bearbeitet, also ist es jetzt Hals: D –

+0

@noob Aha macht jetzt ein bisschen mehr Sinn. Ich habe das Attribut 'class' so geändert, dass es dem Verhalten von regex entspricht. Im Zusammenhang mit Multibyte-Fragen und OP-Verwendungen noch unklar. – chris85

Antwort

0

Kann mit Rückreferenzen wie $1 durchgeführt werden.

Einfaches Beispiel gerade Handhabung p tags:

$input = '<p clneck="something">my neck hurts</p>'; 
$output = preg_replace('/(<p\s+[^>]+>[^<]*)neck([^<]*<\/p>)/i', '$1head$2', $input); 

Um alle Tags handhaben es ein wenig komplizierter wird, weil wir Referenzen benötigen (\\2) in der passenden Regex auch:

$input = '<p clneck="something">my neck hurts</p><div idneck="foo">my neck hurts, too</div>'; 
$output = preg_replace('/(<(\w+)(\s+[^>]+)>[^<]*)neck([^<]*<\/\\2>)/i', '$1head$4', $input); 
echo $output; 
+0

Nicht schlecht. Aber soweit ich sehen kann (vor dem Test), wird dies nur

behandeln. - Was ist mit all den anderen Tags? – Juergen

+0

Meine Antwort angepasst, um alle Arten von Tags zu behandeln. – maxhb