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+字符,而非[^}]+
]
-文字}
}
-PCRE谓词丢弃到目前为止匹配的文本,并强制引擎从当前位置继续查找下一个匹配项(就像发生了匹配一样)(*SKIP)(*F)
-或|
:\{[^\}]+}
-a\{
{
-1+字符,而非[^\}]+
和}
-文字}
}
2
Array
(
[0] => {test}
[1] => {test3}
)
如果您确信打开大括号之前只会有一对方括号(平衡),那么负回望将完成此工作:
(?<!]){[^}]*}
(?
@WiktorStribiżew谢谢你的详细回答。我正在关注负面展望这个话题。我会尽快回复/更新你的答案。请立即询问不清楚的地方-我会在线几个小时。谢谢。我刚刚意识到我的rexgex有一个错误,我实际上想使用”/(?“lookback断言必须是固定长度的”。因此,在这里使用skip-fail方法是有意义的,而不是倒退。谢谢!很高兴我能提供帮助。(*skip)(*fail)
是在PCRE中否定某些内容的唯一正确方法,在不做假设的情况下无法访问负无限宽度的lookback。非常好的提示,谢谢:)!是否不需要转义]
和}
?
2
Array
(
[0] => {test}
[1] => {test3}
)
(?<!]){[^}]*}