使用preg_replace删除php中两个字符串之间的文本

问题描述 投票:6回答:2

我一直试图从两个标签之间的站点的字符串中删除一段文本。例如:

This is CROPSTART not very CROPEND cool.

...应该成为这个...

This is cool.

这是我尝试过的PHP,通常可以正常工作:

preg_replace('#\/\/CROPSTART[\s\S]+\/\/CROPEND#', '', $string);

但是,当字符串包含多个“ CROPEND”时,它将裁剪从CROPSTART到最后一个CROPEND的所有内容。我希望它仅在第一个CROPSTART和first CROPEND。

之间裁剪。

任何人都知道该怎么做吗?

谢谢元子

php regex preg-replace
2个回答
19
投票

但是,当字符串包含多个“ CROPEND”时,它将裁剪从CROPSTART到最后一个CROPEND的所有内容。

这是因为您的+运算符是贪婪的-它不会在CROPEND的第一个实例处停止并继续直到遇到最后一个实例。

您可以通过在其后附加+来使用?运算符的非贪婪版本:

preg_replace('/CROPSTART[\s\S]+?CROPEND/', '', $string);

0
投票
function replace_all_text_between($str, $start, $end, $replacement) {

    $replacement = $start . $replacement . $end;

    $start = preg_quote($start, '/');
    $end = preg_quote($end, '/');
    $regex = "/({$start})(.*?)({$end})/";

    return preg_replace($regex,$replacement,$str);
}
© www.soinside.com 2019 - 2024. All rights reserved.