如何使用正则表达式检测第二次出现? (PHP)

时间:2011-09-14 02:50:02

标签: php regex

从这个问题How to match this using regex

现在我想从用户提交的数据中搜索3D D关键字。规则是只要句子中存在3D和D,它就是有效的(不区分大小写)。

例如:

  

3Dzzzzzzzzzzzzzzzzzzzzz(无效,因为没有D的第二次出现)
  zzzzzD(因为没有3D而无效)
  xxx3DzzzzzD(有效,因为在字符串中得到3D和D)

我现在正在使用这个正则表达式但不知何故它有一个问题。

$subject = 'BLASHSH*3D*8qw9e08e2323*D*';

if(preg_match('/(?=.*3D)(?=.*D).*/i', $subject))
{
    echo 'pattern match';
}
else
{
    echo 'fail';
}

问题是这个字符串也会返回true

  

3D(它应该是无效的,因为没有第二次出现D)
  3D ABC(它应该无效,因为没有第二次出现D)

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

假设3DDD3DcccDzzz3D都有效:

/(3D.*D)|(D.*3D)/i

由于您在我假设您要接受i3d之前使用了d修饰符?如果不只是从正则表达式的末尾删除i

答案 1 :(得分:1)

如果规则是3D必须出现在D之前,并且可以在之前,之后或之间(包括零个字符)包含任意数量的字符,这应该足够了:

/3D.*D/i