2016-07-21 10 views
-2

IPHP-REGEX - Ersetzen Zeilenumbruch mit <br> innerhalb Pre-Tags

<pre> 
Line one 
Line two 
Line three 
Line four 
Line five 
Line six 
</pre> 

haben Wenn ich die Pre-Tags Streifen wird es

Linie ein Linie zwei Linie drei Linie vier Linie fünf Zeile sechs

Was wäre die Regex zum Ersetzen neuer Zeilen mit einem br, so dass nach dem Abisolieren Pre-Tag jede Zeile getrennt ist.

+0

So Zeichenfolge derzeit ' \ n \ Zeilenumbrüche und Sie möchten sie durch '
' ersetzen? Was siehst du, wenn du 'var_dump ($ string)' die Zeichenfolge? – BeetleJuice

+0

Schauen Sie sich die Funktion 'nl2br' an. – chris85

+1

Mögliches Duplikat von [Ersetzen von \ r & \ n mit
?] (Http://stackoverflow.com/questions/5946114/how-to-replace-rn-with-br) – chris85

Antwort

1

Sie An jeder Position müssen überprüfen, ob Sie in einem gültigen <pre> Tag sind:

~(?s)(?<!<pre>)\R(?!</pre>)(?=((?!<pre>).)*</pre>)~ 

Erläuterung:

(?s)    # Set DOT_ALL modifier 
(?<!<pre>)   # Assert if we are not immediately after an opening <pre> tag 
\R     # We need new-lines only 
(?!</pre>)   # Not followed by a closing </pre> tag 
(?=     # Beginning of a positive lookahead 
    ((?!<pre>).)* # To look if we are not behind an opening <pre> tag (inside a <pre> tag) 
    </pre>   # Which has a closing </pre> tag 
)     # End of lookahead 

Live demo

Hinweis: Es spielt keine Wenn Sie verschachtelthaben, liefern Sie keine erwarteten Ergebnisse 210 Tags

Aber wenn Sie sind komfortabel mit DOM zu arbeiten, dann gibt es eine passende Lösung für diese (!):

<?php 

$html = <<< HTML 
<div> 
<div> 
test 
test 
test 
</div> 
<pre> 
Line one 
Line two 
Line three 
Line four 
Line five 
Line six 
</pre> 
</div> 
HTML; 

$dom = new DOMDocument; 
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$preTags = $dom->getElementsByTagName('pre'); 

foreach ($preTags as $key => $pre) { 
    $pre->nodeValue = str_replace(PHP_EOL, '~*~*', $pre->nodeValue); 
} 

echo str_replace("~*~*", '<br />', $dom->saveHTML()); 

Ausgang:

<div> 
<div> 
test 
test 
test 
</div> 
<pre><br />Line one<br />Line two<br />Line three<br />Line four<br />Line five<br />Line six<br /></pre> 
</div>