Php 获取没有特定前缀组的所有单词

Php 获取没有特定前缀组的所有单词,php,regex,Php,Regex,我有一个以下形式的字符串 $string = "This is {test} for [a]{test2} for {test3}."; 我想得到所有没有方括号前缀的花括号。因此,在上面的字符串中,我希望得到{test}和{test3},而不是[a]{test2} 我在回答中发现,这可能与消极前瞻有关。所以我试过了 $regex = '/(?:(?!\[[^\}]+\])\{[^\}]+\})/'; echo preg_match_all($regex,

我有一个以下形式的字符串

$string = "This is {test} for [a]{test2} for {test3}.";
我想得到所有没有方括号前缀的花括号。因此,在上面的字符串中,我希望得到
{test}
{test3}
,而不是
[a]{test2}

我在回答中发现,这可能与消极前瞻有关。所以我试过了

  $regex      = '/(?:(?!\[[^\}]+\])\{[^\}]+\})/';
  echo preg_match_all($regex, $string, $matches) . '<br>';
  print_r($matches);
$regex='/(?:(?!\[[^\}]+\])\{[^\}]+\})/;
echo preg_match_all($regex,$string,$matches)。'
'; 打印(匹配项);
但这仍然给了我所有的三个花括号

三,

数组([0]=>数组([0]=>{test}[1]=>{test2}[2]=>{test3}) )


为什么这不起作用?

您的正则表达式失败的原因是它匹配任何
{
(后跟1+非
}
s,然后是
}
),如果它没有在负前瞻中启动一系列模式,则在
[
,除
}
之外的1+字符,然后是
]
(这总是正确的,因此,您会得到所有的
{…}
子字符串)

使用:

详细信息

  • \[^]]*]\{[^}]+}(*SKIP)(*F)
    -匹配
    • \[
      -a
      [
    • [^]]*
      -0+字符,而非
      ]
    • ]\{
      -
      ]{
      子字符串
    • [^}]+
      -1+字符,而非
      ]
    • }
      -文字
      }
    • (*SKIP)(*F)
      -PCRE谓词丢弃到目前为止匹配的文本,并强制引擎从当前位置继续查找下一个匹配项(就像发生了匹配一样)
  • |
    -或
  • \{[^\}]+}
    • \{
      -a
      {
    • [^\}]+
      -1+字符,而非
      }
    • }
      -文字
      }
见:

输出:

2
Array
(
    [0] => {test}
    [1] => {test3}
)

如果您确信打开大括号之前只会有一对方括号(平衡),那么负回望将完成此工作:

(?<!]){[^}]*}
(?

@WiktorStribiżew谢谢你的详细回答。我正在关注负面展望这个话题。我会尽快回复/更新你的答案。请立即询问不清楚的地方-我会在线几个小时。谢谢。我刚刚意识到我的rexgex有一个错误,我实际上想使用
”/(?“lookback断言必须是固定长度的”。因此,在这里使用skip-fail方法是有意义的,而不是倒退。谢谢!很高兴我能提供帮助。
(*skip)(*fail)
是在PCRE中否定某些内容的唯一正确方法,在不做假设的情况下无法访问负无限宽度的lookback。非常好的提示,谢谢:)!是否不需要转义
]
}
2
Array
(
    [0] => {test}
    [1] => {test3}
)
(?<!]){[^}]*}