Php Regex:如何停止对某些不存在的单词的匹配

Php Regex:如何停止对某些不存在的单词的匹配,php,regex,preg-match,Php,Regex,Preg Match,我承认,这个标题太令人困惑了——如果你想改变它,欢迎你 我正在研究PHP和preg_match函数 问题是这个字符串(只是一个示例) 在更新级联时删除级联(另一个示例..) 我需要查找“删除”和“更新”值,但它们不能同时存在 所以有时候我会这样: ON DELETE something 其他时间: ON UPDATE something 其他时候两者都有 所以,这个正则表达式并没有涵盖所有的可能性: /ON DELETE (.+) ON UPDATE (.+)/ 如果我把 /ON DELE

我承认,这个标题太令人困惑了——如果你想改变它,欢迎你

我正在研究PHP和preg_match函数

问题是这个字符串(只是一个示例)

在更新级联时删除级联
(另一个示例..)

我需要查找“删除”和“更新”值,但它们不能同时存在

所以有时候我会这样:

ON DELETE something
其他时间:

ON UPDATE something
其他时候两者都有

所以,这个正则表达式并没有涵盖所有的可能性:

/ON DELETE (.+) ON UPDATE (.+)/
如果我把

/ON DELETE(+)(ON UPDATE(+.*)?/
——涵盖没有ON UPDATE的情况

若存在更新时,第一组结果为“更新级联时设置NULL”


我如何才能做到这一点?

如果要避免匹配过多,请使用lookaround:

消极前瞻:

/ON DELETE ((?:(?! ON UPDATE).)+)( ON UPDATE (.*))?/
要捕获忽略订单的内容,请执行以下操作:

/(?:ON DELETE ((?:(?! ON UPDATE).)+)|ON UPDATE ((?:(?! ON DELETE).)+))/

但你到底想要什么?如果两者都存在,请将其删除?

用于检查您的regexp

psuedo代码,以匹配删除时和更新时发生的情况,但不能同时检查两者

function valid(str)
{
 matchDelete=regex(str, 'ON DELETE'); //true for match
 matchUpdate=regex(str, 'ON UPDATE'); //true for match

 if(   (matchDelete || matchUpdate ) && !(matchDelete && matchUpdate)  )
 {
   valid match
 }
}

好的,我更新了我的答案。如果您想匹配两者是否都存在,并且如果其中只有一个存在,则第二个正则表达式应该进行匹配。
function valid(str)
{
 matchDelete=regex(str, 'ON DELETE'); //true for match
 matchUpdate=regex(str, 'ON UPDATE'); //true for match

 if(   (matchDelete || matchUpdate ) && !(matchDelete && matchUpdate)  )
 {
   valid match
 }
}