如何替换特定字符串之间的所有特定字符串?

时间:2015-03-19 21:22:00

标签: php regex

我想用占位符替换\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>";

2 个答案:

答案 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);
?>