php - 用 BR 标签替换换行符,但只在 PRE 标签内

标签 php regex html-parsing

现货PHP5,有什么好preg_replace进行此转换的表达式:

<br /> 替换换行符, 但仅限于 <pre> block

(请随意做出简化假设,并忽略极端情况。例如,我们可以 假设标签是一行,而不是病态的东西,比如 )

输入文字:

<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>

(激励背景:试图解决维基媒体 SyntaxHighlight_GeSHI 扩展中的错误 20760,发现我的 PHP 技能(我主要使用 Python)不合格)。

除了 regexen 之外,我对其他解决方案持开放态度,但首选小型解决方案(例如,构建 html 解析机制就有点过分了)。

最佳答案

是这样的吗?

<?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 ) );
}

关于php - 用 BR 标签替换换行符,但只在 PRE 标签内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1517102/

相关文章:

java - HTML 解析的 JUnit 测试

java - 从html代码中提取图片url的正则表达式

regex - PostgreSQL UPDATE 子字符串替换

php - 使用 Amazon RDS 和 EC2 连接超时

php - 在主类中调用子方法

php - 改善大流量下服务器响应延迟

PHP 将命令 "mailq"的输出获取到数组

php - 如何编写正则表达式来匹配 ftp、ftps 或 sftp?

python - 如何在 Beautiful Soup 中将网页抓取的输出写入列而不是行

javascript - 如何使用 jQuery 获取非特定 DIV 元素的内容