如何用新行replace所有的XHTML / HTML换行符(<br>)?
我正在寻找最好的br2nl
函数。 我想用换行符replace所有的
和<br>
实例。 非常像nl2br()函数,但相反。 <br />
我知道在PHP手册评论中有几个解决scheme,但我正在从SO社区寻求有关可能解决scheme的反馈。
我通常会说“ 不要使用正则expression式来处理HTML ”,但是,在这一个,我可能会去一个正则expression式,考虑到<br>
标签通常看起来像:
-
<br>
-
<br/>
或者,在/
我想这样的事情可以做到这一点:
$html = 'this <br>is<br/>some<br />text <br />!'; $nl = preg_replace('#<br\s*/?>#i', "\n", $html); echo $nl;
一对笔记:
- 从开始
- 其次是任意数量的白色字符:
\s*
- optionnaly,a
/
:/?
- 最后,一个
>
- 而这个使用不区分大小写的匹配(
#i
),因为<BR>
在HTML中是有效的
您应该使用PHP_EOL
常量来创build与平台无关的换行符。
在我看来,尽可能使用非正则expression式函数使得代码更具可读性。
$newlineTags = array( '<br>', '<br/>', '<br />', ); $html = str_replace($newlineTags, PHP_EOL, $html));
我知道这个解决scheme有一些缺陷,但是仍然想分享我的见解。
如果文档格式良好(或者至less格式良好),则可以使用DOM扩展和xpath来查找并replace\ 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();
来自nl2br的评论:
<?php function br2nl($string){ $return=eregi_replace('<br[[:space:]]*/?'. '[[:space:]]*>',chr(13).chr(10),$string); return $return; } ?>