Php 如果不匹配,则进行预匹配

Php 如果不匹配,则进行预匹配,php,regex,preg-match,Php,Regex,Preg Match,是否可以对不应该匹配的内容执行preg_match,同时仍返回true 例如,目前我们有 if (preg_match('#^Mozilla(.*)#', $agent)) { 我们想检查Mozilla字符串是否不在$agent中,但仍有preg_match返回true 因此我们无法将其更改为… if (!preg_match('#^Mozilla(.*)#', $agent)) { 谢谢 我希望我没有误解你的问题preg_match将返回0(未找到)、1(找到1个匹配项,不搜索更多)或fa

是否可以对不应该匹配的内容执行
preg_match
,同时仍返回true

例如,目前我们有

if (preg_match('#^Mozilla(.*)#', $agent)) {
我们想检查Mozilla字符串是否不在$agent中,但仍有
preg_match
返回true

因此我们无法将其更改为…

if (!preg_match('#^Mozilla(.*)#', $agent)) {
谢谢

我希望我没有误解你的问题
preg_match
将返回0(未找到)、1(找到1个匹配项,不搜索更多)或false(出现一些问题)。当从
preg\u match
返回
false
时,我使用
==
不返回true,您想要的是a,语法是:

if (preg_match('#^(?!Mozilla).#', $agent)) {
实际上,您可能只需要
#^(?!Mozilla)#
就可以做到这一点。我不知道PHP对一个只有零宽度标记的模式会有什么感觉,但是


编辑: 如果您想确保
Mozilla
不会出现在字符串中的任何位置,您可以使用此

if (preg_match('#^((?!Mozilla).)*$#', $agent)) {
…但前提是你不能用这个

if (strpos($agent, 'Mozilla') !== false) {

您可以像这样使用负前瞻:

#^(?!Mozilla)(.*)#

我不明白。为什么不能使用后者呢?正则表达式部分是动态的,我们可以改变它,但我们不能改变它的行,虽然它只是为了演示,但这并不重要。即使您的模式没有固定,并且您希望检查模式是否不匹配,您只需要反转
preg_match
的返回值。关键是我不能更改脚本的逻辑,如果可以,我只会使用
if(!preg_match
preg_match('.^Mozilla(.*),$agent)===0
与询问者声明他们不能做的
!preg\u match('.^Mozilla(.*),$agent)
相同。@walf这不是同一点。0==false但0!==false。没有人讨论正则表达式中的语法错误,我敢打赌
$agent
将始终是一个字符串。因此
preg\u match()
将永远不会返回
false
!preg_match()
preg_match()==0
生成完全相同的布尔值。无论哪种方式,您都没有读到正则表达式是动态的,因此实际的代码将类似于
如果(preg_match($test,$agent)){
,而您不能(非常简单地)选择是否动态否定
preg\u match()
#^(?!Mozilla)(.*)#