Php 如何用新行替换所有XHTML/HTML换行符(<;br>;)?
我正在寻找最好的Php 如何用新行替换所有XHTML/HTML换行符(<;br>;)?,php,regex,newline,Php,Regex,Newline,我正在寻找最好的br2nl功能。我想用换行符\n替换和的所有实例。很像函数,但正好相反 我知道PHP手册评论中有几种解决方案,但我正在寻求SO社区对可能的解决方案的反馈。我通常会说“不要使用正则表达式来处理HTML”,但在这一点上,我可能会使用正则表达式,因为标记通常看起来像: 或,在/ 我想像这样的事情会起作用: $html = 'this <br>is<br/>some<br />text <br />!'; $nl = preg
br2nl
功能。我想用换行符\n
替换
和
的所有实例。很像函数,但正好相反
我知道PHP手册评论中有几种解决方案,但我正在寻求SO社区对可能的解决方案的反馈。我通常会说“不要使用正则表达式来处理HTML”,但在这一点上,我可能会使用正则表达式,因为
标记通常看起来像:
- 或
,在/
我想像这样的事情会起作用:
$html = 'this <br>is<br/>some<br />text <br />!';
$nl = preg_replace('#<br\s*/?>#i', "\n", $html);
echo $nl;
$html='这
是一些
文本
!';
$nl=preg_replace(“##i”、“\n”、$html);
echo$nl;
几点注意:
- 以
- 使用不区分大小写的匹配(
#i
),这在HTML中是有效的
如果文档格式正确(或至少格式正确),则可以使用和xpath查找所有br元素,并将其替换为\n文本节点
$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();
$in='1!'
…abc
defghi
jkl;
$doc=新文档;
$doc->loadhtml($in);
$xpath=新的DOMXPath($doc);
$tobereplace=array();
foreach($xpath->query('//br')作为$node){
$tobereplace[]=$node;
}
$linebreak=$doc->createTextNode(“\n”);
foreach($toberelease为$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>
...
abc
defghi
jkl
编辑:只有一次迭代的较短版本
$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();
$in='1!'
…abc
defghi
jkl;
$doc=新文档;
$doc->loadhtml($in);
$xpath=新的DOMXPath($doc);
$linebreak=$doc->createTextNode(“\n”);
foreach($xpath->query('//br')作为$node){
$node->parentNode->removeChild($node);
}
echo$doc->savehtml();
来自评论:
<?php
function br2nl($string){
$return=eregi_replace('<br[[:space:]]*/?'.
'[[:space:]]*>',chr(13).chr(10),$string);
return $return;
}
?>
您应该使用PHP\u EOL
常量来生成独立于平台的换行符
在我看来,尽可能使用非regexp函数可以使代码更具可读性
$newlineTags = array(
'<br>',
'<br/>',
'<br />',
);
$html = str_replace($newlineTags, PHP_EOL, $html);
$newlineTags=数组(
“
”,
“
”,
“
”,
);
$html=str\u replace($newlineTags,PHP\u EOL,$html);
我知道此解决方案存在一些缺陷,但仍想分享我的见解。是否确实要用物理换行符替换HTML/XHTML换行符元素?因为nl2br
不替换物理换行符,而只是添加HTML/XHTML换行符元素。我没有使用此函数来否定或恢复从nl2br返回的字符串。我用它来清理遗留数据库中的文本(来自允许html的webapp),然后再将其导入数据库。我刚才说的与nl2br相反,因为人们通常都知道这个函数。这是对正则表达式的一个很好的解释。非常挑剔=]:
在html(而不是xhtml)中是允许的。在CDATA区域中,
是“正常”文本。@VolkerK:hump,true:-);;我是用DOM写这篇文章的,当我写完的时候,我看到你发布了与我提出的解决方案相同的解决方案(除了我使用了getElementsByName,而不是XPath),所以没有发布它——也许我应该编辑我的答案,尽管为了完整性,因为它已经被接受了……但是这个解决方案更快,占用内存更少(如果这是一件事)。如果你没有完全武断的文件,我可能会认为这些边缘情况是可以接受的。第二个论点不应该是“\n”吗?这是我在这里设置的唯一的事情。你不需要做两个回合。你可以用第一个代码替换前缀[Oracle < /Cord>。(未知)我记得它中断xpath迭代器的原因。较短版本没有添加$linebreak
节点。无论如何,这正是我需要的,谢谢。posix正则表达式模块已被弃用。从ereg_替换手册页面:“从PHP 5.3.0开始,此函数已被弃用,并从PHP 6.0.0开始删除。强烈建议不要依赖此功能。"而正则表达式通常需要更大的计算量。@BenBITDesign关于您建议的编辑,请注意,一般来说,正则表达式需要更多的计算量是绝对不正确的。事实上,在没有对这种特定情况进行计时的情况下,PCRE引擎很可能比str更有效地执行这种替换_替换
,尤其是启用即时编译时。