Php 未括在括号内时,用正则表达式替换单词

Php 未括在括号内时,用正则表达式替换单词,php,regex,Php,Regex,我正在尝试创建一个正则表达式,它将替换没有用括号括起来的单词 以下是我目前拥有的: $this->parsed = preg_replace('/\b(?<!\[)('.preg_quote($word).')\b/','[$1['.implode(",",array_unique($types)).']]',$this->parsed); $this->parsed=preg\u replace('/\b(?)? 当我尝试进行动态查找时,它会出现以下错误:“编译失败:查找断

我正在尝试创建一个正则表达式,它将替换没有用括号括起来的单词

以下是我目前拥有的:

$this->parsed = preg_replace('/\b(?<!\[)('.preg_quote($word).')\b/','[$1['.implode(",",array_unique($types)).']]',$this->parsed);
$this->parsed=preg\u replace('/\b(?)?
当我尝试进行动态查找时,它会出现以下错误:“编译失败:查找断言在偏移量11处的长度不固定”。我不知道如何修复此错误


有谁有什么想法吗?

在又一个上午玩了regex之后,我想出了一个相当脏的解决方案,它一点也不灵活,但适用于我的用例

$this->parsed = preg_replace('/\b(?!\[(|((\w+)(\s|\.))|((\w+)(\s|\.)(\w+)(\s|\.))))('.preg_quote($word).')(?!(((\s|\.)(\w+))|((\s|\.)(\w+)(\s|\.)(\w+))|)\[)\b/s','[$10['.implode(",",array_unique($types)).']]',$this->parsed);
它的基本功能是检查括号中是否没有单词,前面或后面是否有1个单词或2个单词,以及指定的关键字


不过,如果有人有更好的解决方案,那就太好了。

您可以将括号内的任何子字符串与
\[^][]*]
模式匹配,然后使用删除匹配,并且只在任何其他上下文中匹配您的模式:

\[[^][]*](*SKIP)(*FAIL)|your_pattern_here
请参阅。要跳过成对嵌套方括号内的匹配,请使用带子例程的基于递归的正则表达式(注意,它必须使用捕获组):

\[[^][]*\[^][[]*]
正则表达式将匹配与替换模式包装的所有事件:

  • \[
    -a
    [
  • [^][]*
    -0+字符,而不是
    [
    ]
  • \[
    -a
    [
    字符
  • [^][]*
    -0+字符,而不是
    [
    ]
  • ]
    -a
    ]
    子字符串

在大多数GREP实现中,Lookbehinds必须是固定长度的。您尝试过的是什么?(另外:为什么替换“从最大到最小”是一个问题?)让我试着重新表述这个问题:如果某个单词或短语没有括起来,你想匹配它,那么就把它括起来?Jongware:从最大到最小的替换不是问题,但是最小的字符串可能包含已经存在于较大字符串中的部分,因此不必再括起来,因为较大的字符串戒指已经用括号括起来了。@Sniffer确切地说,请看我对JongwareOK的解释。我想我确切地知道你想要什么,这有点困难,我还有一个问题。如果一个括号在那里,而另一个括号不见了,你应该怎么做,否则这永远不会发生?这永远不会发生,因为括号是通过编程生成的Y
(?<skip>\[(?:[^][]++|(?&skip))*])(*SKIP)(*FAIL)|your_pattern_here
$this->parsed = preg_replace(
    '/\[[^][]*\[[^][]*]](*SKIP)(*FAIL)|\b(?:' . preg_quote($word, '/') . ')\b/', 
    '[$0[' . implode(",", array_unique($types)) . ']]',
    $this->parsed);