PHP preg_replace - 替换文本部分但不要太快

PHP preg_replace - Replace text part but not too soon

使用:

$text = preg_replace("/\[\[(.*?)SPACE(.*?)\]\]/im",'',$text);

清理并得到wordtwo

$text = '..text.. [[wordoneSPACE**wordtwo**]] ..moretext..';

但如果文本有 [[ before

则失败
$text = '.. [[ ..text(not to cut).. [[wordoneSPACE**wordtwo**]] ..moretext..';

我怎样才能限制到只有 SPACE 这个词的地方?

如果[[...]]里面没有[]可以用

$text = preg_replace("/\[\[([^][]*)SPACE([^][]*)]]/i",'',$text);

regex demo[^][] 否定字符 class 将只匹配除 [] 之外的字符,并且不会跨越 [[...]] 边界。

否则,使用 :

$text = preg_replace("/\[\[((?:(?!\[{2}).)*?)SPACE(.*?)]]/is",'',$text);

参见 this regex demo

(?:(?!\[{2}).)*? 模式将匹配任何字符,重复 0 次或多次但尽可能少,不会开始 [[ 字符序列,并且不会跨越下一个实体 [[边框。

另一个选项可能是使用 possessive quantifiers

在第一组中,您可以使用否定字符 class 来匹配除方括号或 S 之外的任何字符(如果其后跟 SPACE。

\[\[([^][S]++(?:S(?!PACE)|[^][S]+)*+)SPACE([^][]++)\]\]

部分

  • \[\[ 匹配 [[
  • ( 捕获 组 1
    • [^][S]++ 匹配除 S、] 或 [
    • 以外的任何字符 1 次以上
    • (?:非捕获组
      • S(?!PACE) 匹配后面没有 PACE
      • 的 S
      • |
      • [^][S]+ 匹配除 S、] 或 [
      • 以外的任何字符 1 次以上
    • )*+关闭群重复0+次
  • ) 关闭组 1
  • SPACE字面匹配
  • ( 捕获 第 2 组
    • [^][]++ 匹配除 ][
    • 之外的任何字符 1+ 次
  • ) 关闭群组
  • \]\] 匹配 ]]

Regex demo