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

mar*_*rkb 38 php regex newline

我正在寻找最好的br2nl功能.我想更换的所有实例<br>,并<br />用换行\n.很像nl2br()函数,但相反.

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

Pas*_*TIN 96

我通常会说" 不要使用正则表达式来处理HTML ",但是,就此而言,我可能会使用正则表达式,因为<br>标签通常看起来像:

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


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

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

几个笔记:

  • 以..开始 <br
  • 后跟任意数量的白色字符: \s*
  • optionnaly,a /:/?
  • 最后,一个 >
  • 这使用不区分大小写的match(#i),<BR>这在HTML中是有效的

  • 这是对正则表达式的一个很好的解释. (2认同)
  • 要非常挑剔=]:`<input type ="text"value ="<br />">`在html(不是xhtml)中是允许的.在CDATA部分,"<br />"是"正常"文本. (2认同)
  • 但是这种解决方案更快,内存消耗更少(如果这是一个问题).如果你没有_completely_任意文件,我可能会认为这些边缘情况是可以接受的. (2认同)

Ant*_*tti 7

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

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

$newlineTags = array(
  '<br>',
  '<br/>',
  '<br />',
);
$html = str_replace($newlineTags, PHP_EOL, $html);
Run Code Online (Sandbox Code Playgroud)

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