我已阅读preg_match上的众多帖子,但无法找到答案。当只有一部分大海捞针失败时,如何使整个preg_match失败?当haystack以dot-anything(例如.html)结尾时,我只需要使整个preg_match失败。
在问题区域之前的此处的分组是出于其他目的而需要的,并且无法更改。我想要失败的部分,当它包含一个点时,是:([^\.])*
如果失败,整个preg_match都需要失败。注意:点只是一个"失败的点"如果它发生在连字符后面。在连字符之前有点没有失败的点。
OR运算符右侧的所有内容都很好。那里什么都不需要改变。
preg_match('#^(.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$#', $haystack, $return_array)
由于我没有评估点的整个字符串,所以我没有成功地使用负向前瞻。它只会失败一部分,而不会使整个preg_match失败。
答案 0 :(得分:0)
您可以在正则表达式的开头添加任何此类条件(负面)。
preg_match('#^(?!.*\..+$)((.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$)#', $haystack, $return_array)
当有'。'时,它会失败。之后至少有一个角色。但是,如果您正在寻找文件版本,您可以例如限制以下字符的数量:
(?!.*\..{1,4}$)
请参阅regex101
中的简单示例答案 1 :(得分:0)
如果这是有效的,那么有没有人知道他们的头脑是什么(开始和结束插入符号和美元在OR的每一侧)?它似乎在我的预备测试中有效:
'#^misc-stuff-and-reg-ex$|^other-stuff-and-reg-ex$#'
如果它实际上是有效的,而不只是看起来工作,那么我也可以用一种看起来不那么重的处理器来解决我的问题,只需这样做:
'#^(.*)\/([0-9]+)\-([^\.]*)$|^(.*)id_category=([0-9]+)(.*)$#'
它似乎是一种解决方案。当一个点在连字符后面时,我不想要匹配,并且它似乎在测试中满足到目前为止,并且由于将插入符号/美元分开而没有弄脏任何东西。
对我来说有趣的是,当美元符号没有明确地放在no-dot-here部分之后,那么no-dot-here部分不会被隐式视为结束haystack(因此,如果存在dot,也会让我们成功地不匹配),即使它紧跟在OR运算符旁边。或者,也许这不是很有趣,因为OR运算符的另一面只是被视为字符串的一部分,即使它像左侧一样实际上是实际意义上的整个字符串。