Php 如何使用正则表达式检测第二次出现?(菲律宾)

Php 如何使用正则表达式检测第二次出现?(菲律宾),php,regex,Php,Regex,从这个问题 现在我想从用户提交的数据中搜索3D D关键字。只要3D和D出现在句子中,该规则就是有效的(不区分大小写) 例如: 3DZZZZZZZZZZZZ(无效,因为没有第二次出现D) ZZZZD(由于没有3D,因此无效) xxx3DzzzzzD(有效,因为字符串中有3D和D) 我现在正在使用这个正则表达式,但不知为什么它有一个问题 $subject = 'BLASHSH*3D*8qw9e08e2323*D*'; if(preg_match('/(?=.*3D)(?=.*D).*/i', $s

从这个问题

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

例如:

3DZZZZZZZZZZZZ(无效,因为没有第二次出现D)
ZZZZD(由于没有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)


如何解决这个问题

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

/3D.*D/i

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

/3D.*D/i

假设
3DD
D3D
CCCDZZ3D
均有效:

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

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

假设
3DD
D3D
cccDzzz3D
都是有效的:

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

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

听起来3D必须在第二个D之前。如果我理解正确。是的,它不区分大小写。D也可以在3D之前变成。谢谢。听起来3D必须在第二个D之前。如果我理解正确的话。是的,它不区分大小写。D也可以在3D之前变成。谢谢