如何用新行替换所有XHTML / HTML换行符(<br/>)?

时间:2010-03-12 21:51:58

标签: php regex newline

我正在寻找最好的br2nl功能。我想用换行符<br>替换<br><br />的所有实例。很像nl2br()函数,但反之亦然。

我知道PHP手册评论中有几个解决方案,但我正在寻找SO社区对可能解决方案的反馈。

4 个答案:

答案 0 :(得分:92)

我通常会说“不使用正则表达式来处理HTML ”,但是,就此而言,我可能会使用正则表达式,考虑到<br>标签通常看起来比如:

  • <br>
  • <br/>,在/
  • 之前有任意数量的空格


我想这样的事情可以解决问题:

$html = 'this <br>is<br/>some<br />text <br    />!';
$nl = preg_replace('#<br\s*/?>#i', "\n", $html);
echo $nl;

几个笔记:

  • <br
  • 开头
  • 后跟任意数量的白色字符:\s*
  • optionnaly,//?
  • ,最后是>
  • 这是使用不区分大小写的匹配(#i),因为<BR>在HTML中有效

答案 1 :(得分:6)

您应该使用PHP_EOL常量来获得与平台无关的换行符。

在我看来,尽可能使用非正则表达式函数可以使代码更具可读性。

$newlineTags = array(
  '<br>',
  '<br/>',
  '<br />',
);
$html = str_replace($newlineTags, PHP_EOL, $html));

我知道这个解决方案存在一些缺陷,但仍想分享我的见解。

答案 2 :(得分:1)

如果文档格式正确(或至少格式良好),您可以使用DOM extension和xpath通过\ n文本节点查找和替换所有br元素。

$in = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>';

$doc = new DOMDOcument;
$doc->loadhtml($in);
$xpath = new DOMXPath($doc);

$toBeReplaced = array();
foreach($xpath->query('//br') as $node) {
    $toBeReplaced[] = $node;
}

$linebreak = $doc->createTextNode("\n");
foreach($toBeReplaced as $node) {
    $node->parentNode->replaceChild($linebreak->cloneNode(), $node);
}

echo $doc->savehtml();

打印

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><title>...</title></head>
<body>abc
def<p>ghi
jkl</p>
</body>
</html>

编辑:只有一次迭代的短版本

$in = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>';

$doc = new DOMDOcument;
$doc->loadhtml($in);
$xpath = new DOMXPath($doc);

$linebreak = $doc->createTextNode("\n");
foreach($xpath->query('//br') as $node) {
  $node->parentNode->removeChild($node);
}

echo $doc->savehtml();

答案 3 :(得分:0)

来自nl2br评论:

<?php
function br2nl($string){
  $return=eregi_replace('<br[[:space:]]*/?'.
    '[[:space:]]*>',chr(13).chr(10),$string);
  return $return;
}
?>