与BR标签替换换行,但里面只有PRE标签
-
19-09-2019 - |
题
在库存PHP5,什么是好的preg_replace
表达式用于制备该转化:
<强>替换<br />
换行,但只有内<pre>
块强>
(随时作出简化的假设,而忽略角落的情况。例如,我们可以 假设标签将是一条线,而不是病理之类的东西)
输入文本:
<div><pre class='some class'>1
2
3
</pre>
<pre>line 1
line 2
line 3
</pre>
</div>
输出:
<div><pre>1<br />2<br />3<br /></pre>
<pre>line 1<br />line 2<br />line 3<br /></pre>
</div>
(激励背景:试图收出错误20760在维基媒体SyntaxHighlight_GeSHI扩展,并找到我的PHP技能(我主要是做Python)的不及格)
。我接受其他的解决方案,除了使用regexen,但小是优选的(作为一个例子,构建HTML解析机械是矫枉过正)。
解决方案 2
根据东西SilentGhost所述(其未显示在这里,供某些原因):
<?php
$str = "<div><pre class='some class' >1
2
3
< / pre>
<pre>line 1
line 2
line 3
</pre>
</div>";
$out = "<div><pre class='some class' >1<br />2<br />3<br />< / pre>
<pre>line 1<br />line 2<br />line 3<br /></pre>
</div>";
function protect_newlines($str) {
// \n -> <br />, but only if it's in a pre block
// protects newlines from Parser::doBlockLevels()
/* split on <pre ... /pre>, basically. probably good enough */
$str = " ".$str; // guarantee split will be in even positions
//$parts = preg_split('/(<pre .* pre>)/Umsxu',$str,-1,PREG_SPLIT_DELIM_CAPTURE);
$parts = preg_split("/(< \s* pre .* \/ \s* pre \s* >)/Umsxu",$str,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach ($parts as $idx=>$part) {
if ($idx % 2) {
$parts[$idx] = preg_replace("/\n/", "<br />", $part);
}
}
$str = implode('',$parts);
/* chop off the first space, that we had added */
return substr($str,1);
}
assert(protect_newlines($str) === $out);
?>
其他提示
像这样?
<?php
$content = "<div><pre class='some class'>1
2
3
</pre>
<pre>line 1
line 2
line 3
</pre>
</div>
";
function getInnerHTML($Node)
{
$Body = $Node->ownerDocument->documentElement->firstChild->firstChild;
$Document = new DOMDocument();
$Document->appendChild($Document->importNode($Body,true));
return $Document->saveHTML();
}
$dom = new DOMDocument();
$dom->loadHTML( $content );
$preElements = $dom->getElementsByTagName('pre');
if ( count( $preElements ) ) {
foreach ( $preElements as $pre ) {
$value = preg_replace( '/\n|\r\n/', '<br/>', $pre->nodeValue );
$pre->nodeValue = $value;
}
echo html_entity_decode( getInnerHTML( $dom->documentElement ) );
}
不隶属于 StackOverflow