我想用占位符替换\n
内的所有<pre></pre>
。这就是我创造的:
<?php
$html = "<div>\n<pre id=foo>Foo\n\nBar Bar\nFoo Foo</pre>\n\n</div>";
echo preg_replace("/(<pre[^>]*>[^<]*)(\n)([^<]*<\/pre)/", "$1{NEWLINE}$3", $html);
?>
它只会按预期替换一个\n
。我是否需要使用preg_replace_callback()和单独的函数来替换换行符,还是仅使用一个正则表达式?
编辑:任何可用的解决方案吗?
$html2 = "<div>\n<pre id=foo><b>Foo\n\n</b>Bar Bar\nFoo Foo</pre>\n\n</div>";
答案 0 :(得分:1)
您可以按照建议使用回调来执行此操作。
$html = preg_replace_callback('~<pre[^>]*>\K.*?(?=</pre>)~si',
function($m) {
return str_replace(array("\r\n", "\n", "\r"), '{NEWLINE}', $m[0]);
}, $html);
虽然,我建议使用DOM来执行此任务。
$doc = new DOMDocument;
@$doc->loadHTML($html); // load the HTML
$nodes = $doc->getElementsByTagName('pre');
$find = array("\r\n", "\n", "\r");
foreach ($nodes as $node) {
$node->nodeValue = str_replace($find, '{NEWLINE}', $node->nodeValue);
}
echo $doc->saveHTML();
答案 1 :(得分:0)
我的问题是重复:
https://stackoverflow.com/a/5756032/318765
这就是我需要的:
<?php
echo preg_replace("/(\r\n|\n\r|\n|\r)(?=[^<>]*<\/pre)/", "{NEWLINE}", $html);
?>