preg_replace如何在选择器中仅替换匹配的xxx($ 1)yyy模式

Par*_*oft 30 php regex replace preg-match regex-group

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

preg_replace('/text1(text2)text3/is','',$html);
Run Code Online (Sandbox Code Playgroud)

这会用''代替整个字符串.我只想删除text2,但保留text1和text3.如何匹配和替换匹配的字符串部分?

mar*_*rio 42

有一种替代方法可以使用text1text3匹配模式,然后通过替换字符串将它们放回去.你可以使用这样的断言:

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您的lookbehind模式不产生固定长度匹配,则反向引用可能更好 (3认同)
  • 这很酷,我不知道您可以做到这一点!+1 (2认同)

Man*_*qui 37

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

preg_replace('/(text1)text2(text3)/is','$1$2',$html);
Run Code Online (Sandbox Code Playgroud)


aor*_*sik 15

试试这个:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text);
Run Code Online (Sandbox Code Playgroud)

希望它有效!

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

  • 请使用$ n而不是\\n. (5认同)
  • 使用$ n超过\\n是官方建议,引用手册:"[...]可能包含形式\\n或(自PHP 4.0.4)$ n的引用,后一种形式是首选一".我不知道这背后的确切原因,但$语法至少a)更具可读性,b)也支持$ {n}.也许还有其他原因. (3认同)
  • 在2018年更好地使用它:http://dk2.php.net/manual/en/function.preg-replace-callback.php (2认同)