38

我正在尝试使用正则表达式仅擦除字符串的匹配部分。我正在使用该preg_replace函数,并尝试通过在匹配部分周围放置括号来删除匹配的文本。例子:

preg_replace('/text1(text2)text3/is','',$html);

这会用 '' 替换整个字符串。我只想擦除 text2,但保持 text1 和 text3 不变。如何匹配和替换匹配的字符串部分?

4

4 回答 4

51

使用反向引用(即括号)仅保留您想要记住的表达式部分。$1您可以使用,$2等调用替换字符串中的内容:

preg_replace('/(text1)text2(text3)/is','$1$2',$html);
于 2011-02-04T13:01:26.337 回答
45

text1除了在匹配模式中使用andtext3然后通过替换字符串将它们放回原处之外,还有一种替代方法。你可以使用这样的断言

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt);

这样,正则表达式只查找存在,但在应用替换时不考虑这两个字符串。

http://www.regular-expressions.info/lookaround.html了解更多信息。

于 2011-02-04T13:05:29.610 回答
17

尝试这个:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text);

希望它有效!

编辑:更改\\1\\2$1$2推荐的方式。

于 2011-02-04T13:00:52.123 回答
-5

最简单的方法已经提到了几种类型。另一个想法是前瞻/回溯,这一次它们有点过头了,但通常非常有用。

于 2011-02-04T13:05:02.450 回答