str_replace或preg_replace只替换最后一个匹配?

时间:2013-02-27 17:05:18

标签: php regex preg-replace

我想替换HTML页面上的最终</body>标记。页面上有很多标签(因为iFrames),所以我只需要替换最后一个。

例如,如果我有这段代码:

</body>
</body>
</body>
</body>

我需要用其他内容替换最后一个</body>标记。

我曾尝试preg_replace("~(?!.*</body>)~",$replace_with,$content);,但效果并不好。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我们将利用贪婪量词并使用一种先进技术:

~.*\K</body>~s

一些解释:

~        # A simple delimiter
.*       # Match anything greedy (until the end)
\K       # Forget what we matched until now
</body>  # Match ¨</body>¨
~        # The closing delimiter
s        # The s modifier to also match newlines with the dot ¨.¨

PHP实现可能如下所示:

$str = '
</body>
Something !
</body>
</body>
</body>
</body>
</html>';

$search = '</body>';
$replace = '</replaced>';

$str = preg_replace('~.*\K'. preg_quote($search, '~') . '~s', '$1' . $replace, $str);

echo $str;

请注意,我们使用preg_quote()来转义可能会从不受信任的用户使用的相应字符。

输出:

</body>
Something !
</body>
</body>
</body>
</replaced>
</html>