2

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

$string = 'test somerandomURL><b>apple</b> peach orange';

我想要一个表达式,它可以检测到第一个 > 之前的所有内容,只要<b>apple</b>不立即跟随第一个 >

我试过了

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';
}

当字符串<b>apple</b>在 > 之后包含时,它会按照我的预期和需要返回 false,但是当我将字符串更改为<b>peach</b>在 > 之后而不是<b>apple</b>它仍然返回 false 并且我需要它返回 true 时。如果没有粗体标签,它似乎可以按我的预期工作。任何想法我做错了什么?

4

1 回答 1

1

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

第一个问题是 .* 是贪婪的。所以在你的字符串中它会匹配:test somerandomURL><b>apple</b>

通常解决方案是让它变得懒惰,但由于负面的前瞻,当发现苹果时.*?,懒惰仍然会使其匹配更远。>

解决方案是否定字符类。[^>]*将匹配任何字符,除了>

/test([^>]*)>(?!<b>apple<\/b>)(.*)/i
于 2013-09-15T02:09:20.550 回答