Php 使用先行否定断言的正则表达式

Php 使用先行否定断言的正则表达式,php,regex,assertion,lookahead,Php,Regex,Assertion,Lookahead,使用php,我希望根据匹配部分后面的部分是否不包含某些字符来检测字符串中的内容。我想我可能需要使用一个前瞻性否定断言,但它并没有像我预期的那样起作用,所以我不确定。例如: $string = 'test somerandomURL><b>apple</b> peach orange'; $string='testsomerandomURL>苹果桃橙'; 我想要一个表达式,只要apple不紧跟在第一个>之后,就可以检测到第一个>之前的所有内容 我试过了 if(pr

使用php,我希望根据匹配部分后面的部分是否不包含某些字符来检测字符串中的内容。我想我可能需要使用一个前瞻性否定断言,但它并没有像我预期的那样起作用,所以我不确定。例如:

$string = 'test somerandomURL><b>apple</b> peach orange';
$string='testsomerandomURL>苹果桃橙';
我想要一个表达式,只要
apple
不紧跟在第一个>之后,就可以检测到第一个>之前的所有内容

我试过了

if(preg_match("/test(.*)>(?!<b>apple<\/b>)(.*)/i",$string)){
echo 'true since <b>apple</b> does not follow > in string';
}else{
echo 'false since <b>apple</b> follows > in string';
}
if(preg_匹配(“/test(.*)>(?!apple)(.*)/i”,$string)){
echo“由于苹果没有在字符串中跟随>而为真”;
}否则{
echo'错误,因为苹果在字符串中跟随>';
}

当字符串在>之后包含
apple
时,它返回false,正如我所期望和需要的,但当我将字符串更改为在>之后包含
peach
而不是
apple
时,它仍然返回false,我需要它返回true。如果没有粗体的标签,它似乎能像我预期的那样工作。你知道我做错了什么吗?

你做错了一些事情,包括没有打开错误报告,因为你有不匹配的
()
,还有一个
/
需要转义

第一个问题是。*是贪婪的。因此,在您的字符串中,它将匹配:
testsomerandomURL>apple

通常,解决这个问题的方法是使用
*?
使它变得懒惰,但由于消极的前瞻性,懒惰仍然会使它与找到苹果时的另一个
相匹配

解决方案是否定的字符类<代码>[^>]*将匹配除

/test([^>]*)>(?!<b>apple<\/b>)(.*)/i
/test([^>]*)>(?!apple)(.*)/i

第一个
*
已经匹配了大部分输入字符串(可能直到结束
s
),这使得您的断言有些多余。试试
[^>]*
--(在有人发布冗余且仅出于历史原因而保留的笑话链接之前,是的,有用于处理散布html的文本的链接。)尝试以下操作:
(?=test.*?>(?!apple)[^]+
第一个
*
在第一个`>处不停的是什么?我该如何让它停下来?@Enissay,如果你认为你有一个解决方案,就把它作为答案发布,而不是评论。但不要发布那一个;
(?=test.*?>
永远不会成功,因为要求后面的四个字符同时是
test
。谢谢,修复了错误,您的表达式得到了我想要的结果。