2012-04-04 16 views
1

Betrachten Sie den folgenden HTML-String:ersetzt Zeilenumbruch mit 2 Spannweiten in php

<p>This is line 1 <br /> and this is line 2</p> 

Wie kann ich die oben mit der folgenden Zeichenfolge ersetzen mit PHP/Regex

<p><span class="single-line">This is line 1</span><span class="single-line">and this is line 2</span></p> 
+2

Die CSS-Spezifikation lehrt Sie nicht mit Klassenattributen und div/Spannweiten Meta-Repräsentation zu erstellen. Also bitte tu es nicht. Die Antwort lautet: DOMDocument + Xpath. – hakre

+1

was ist mit divs? Warum benutzt du nicht div anstelle von span? div ist ein Blockelement, das für dich wie ein Zauber wirken soll. –

+0

div ist kein gültiges Element in einem p – PatrikAkerstrand

Antwort

1

Dies funktioniert, aber ich würde Ihnen raten, nicht für HTML-Analyse/Transformation zu regulären Ausdrücken zu verlassen:

$string = '<p>This is line 1 <br /> and this is line 2</p>'; 
$pattern = '~([^<>]+)<br[[:blank:]]*/?>([^<>]+)~i'; 
$replacement = '<span class="single-line">$1</span><span class="single-line">$2</span>'; 

echo preg_replace($pattern, $replacement, $string); 
1

ich wirklich nicht vorschlagen dass Sie es tatsächlich tun (weil IMHO Sie Markup und Klassen missbrauchen), aber es ist eigentlich ziemlich einfach:

ersetzen Sie

<p> 

mit

<p><span class="single-line"> 

und

<br /> 

mit

</span><span class="single-line"> 

und schließlich

</p> 

mit

</span></p> 

eine PHP-Funktion, die Strings ist strtrDocs ersetzen kann.

Beachten Sie, dass dies nur für genau das HTML-Fragment funktioniert, das Sie in Ihrer Frage angegeben haben. Wenn Sie dies genauer benötigen, sollten Sie die Verwendung von DOMDocument und DOMXPath in Betracht ziehen, wie ich bereits oben erwähnt habe.

+0

Ich werde versuchen, die Spannen in Divs unter Berücksichtigung der Semantik zu ändern. Ich bin mir nicht sicher über die Formatierung, weil unser Client ynymce verwendet, um den Text in die Datenbank einzufügen. – Yens