Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何用新行替换所有XHTML/HTML换行符(<;br>;)?_Php_Regex_Newline - Fatal编程技术网

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更有效地执行这种替换_替换
,尤其是启用即时编译时。