正则表达式:当部分字符串失败时整个字符串失败
regex: fail whole string when part of string fails
我阅读了 preg_match 上的许多帖子,但找不到答案。当大海捞针只有一部分失败时,如何让整个 preg_match 失败?当大海捞针以任何点结尾(例如,.html)时,我只需要让整个 preg_match 失败即可。
此处问题区域之前的分组用于其他目的,无法更改。我想要失败的部分,当它包含一个点时,是: ([^\.])*
如果失败,整个 preg_match 需要失败。注意:如果点出现在连字符之后,它只是一个 "failing dot"。连字符前的点不是失败点。
OR 运算符右侧的所有内容都可以。那里不需要更改任何内容。
preg_match('#^(.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$#', $haystack, $return_array)
因为我没有评估整个字符串的点,所以我没有成功进行负前瞻。它只失败了一部分,没有失败整个 preg_match.
您可以在正则表达式的开头添加任何此类条件作为(负)前瞻。
preg_match('#^(?!.*\..+$)((.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$)#', $haystack, $return_array)
这里如果有'.'就会失败之后至少有一个字符。但是如果你正在寻找文件结尾,你可以例如限制以下字符的数量:
(?!.*\..{1,4}$)
请参阅 regex101
中的一个简单示例
有谁知道这是否有效(开始和结束插入符号和美元 在 OR 的每一侧)?它在我的初步测试中似乎有效:
'#^misc-stuff-and-reg-ex$|^other-stuff-and-reg-ex$#'
如果它确实有效,而不仅仅是看起来有效,那么我还可以使用一种对处理器来说似乎不那么沉重的方法来解决我的问题,只需这样做:
'#^(.*)\/([0-9]+)\-([^\.]*)$|^(.*)id_category=([0-9]+)(.*)$#'
它似乎是作为解决方案进行测试的。当连字符后面有一个点时,我不想要一个匹配项,并且它在目前的测试中似乎满足了这一点,没有因为将 carets/dollars 分开而弄脏任何东西。
我感兴趣的是,当美元符号没有明确地放在无点部分之后时,无点部分就不会隐式看到作为大海捞针的末端(因此如果存在点,我们也可以成功地不匹配),即使它紧挨着 OR 运算符。或者,这可能不是很有趣,因为 OR 运算符的另一侧只是被视为字符串的一部分,尽管它与左侧一样,实际上是实际意义上的整个字符串。
我阅读了 preg_match 上的许多帖子,但找不到答案。当大海捞针只有一部分失败时,如何让整个 preg_match 失败?当大海捞针以任何点结尾(例如,.html)时,我只需要让整个 preg_match 失败即可。
此处问题区域之前的分组用于其他目的,无法更改。我想要失败的部分,当它包含一个点时,是: ([^\.])*
如果失败,整个 preg_match 需要失败。注意:如果点出现在连字符之后,它只是一个 "failing dot"。连字符前的点不是失败点。
OR 运算符右侧的所有内容都可以。那里不需要更改任何内容。
preg_match('#^(.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$#', $haystack, $return_array)
因为我没有评估整个字符串的点,所以我没有成功进行负前瞻。它只失败了一部分,没有失败整个 preg_match.
您可以在正则表达式的开头添加任何此类条件作为(负)前瞻。
preg_match('#^(?!.*\..+$)((.*)\/([0-9]+)\-([^\.])*|(.*)id_category=([0-9]+)(.*)$)#', $haystack, $return_array)
这里如果有'.'就会失败之后至少有一个字符。但是如果你正在寻找文件结尾,你可以例如限制以下字符的数量:
(?!.*\..{1,4}$)
请参阅 regex101
中的一个简单示例有谁知道这是否有效(开始和结束插入符号和美元 在 OR 的每一侧)?它在我的初步测试中似乎有效:
'#^misc-stuff-and-reg-ex$|^other-stuff-and-reg-ex$#'
如果它确实有效,而不仅仅是看起来有效,那么我还可以使用一种对处理器来说似乎不那么沉重的方法来解决我的问题,只需这样做:
'#^(.*)\/([0-9]+)\-([^\.]*)$|^(.*)id_category=([0-9]+)(.*)$#'
它似乎是作为解决方案进行测试的。当连字符后面有一个点时,我不想要一个匹配项,并且它在目前的测试中似乎满足了这一点,没有因为将 carets/dollars 分开而弄脏任何东西。
我感兴趣的是,当美元符号没有明确地放在无点部分之后时,无点部分就不会隐式看到作为大海捞针的末端(因此如果存在点,我们也可以成功地不匹配),即使它紧挨着 OR 运算符。或者,这可能不是很有趣,因为 OR 运算符的另一侧只是被视为字符串的一部分,尽管它与左侧一样,实际上是实际意义上的整个字符串。