【问题标题】:preg_match exclude a numberpreg_match 排除一个数字
【发布时间】:2011-02-25 21:14:23
【问题描述】:

我有这个代码

preg_match("/\bHTTP(.)+ (\d{3})/", $string)

在最后一个模式中,我必须检查一个可以由任何数字组成的 3 位数字,但不应创建像 404401 这样的数字,我该怎么做?

【问题讨论】:

    标签: php regex numbers preg-match regex-negation


    【解决方案1】:

    您可以使用否定前瞻断言来确保匹配的字符串没有404401 as:

    preg_match("/\bHTTP(.+) (?!404|401)(\d{3})/", $string)
    

    Rubular Link

    【讨论】:

    • 有效!如果我做对了,您检查是否存在 401 或 404,如果他们这样做,则字符串不匹配,但由于它不是“强制性的”,如果不存在,正则表达式将继续。这是唯一的方法还是有一种方法可以实际写出“除此 3 位数字之外的 3 位数字”?这似乎更像是一种“解决方法”
    【解决方案2】:

    你想要排除的值越多,这会变得越复杂,但是

    preg_match("/\bHTTP(.+) ([0-35-9]\d{2}|4[1-9]\d|40[0235-9])/", $string)
    

    将匹配任何不以 4 开头的三位数字,

    任何以 4 开头但不以 40 开头的三位数字,

    任何以 40 开头但不是 401 或 404 的三位数字。

    【讨论】:

    • 谢谢!没有要排除的表达式,例如“^”吗?在我看来,我认为这样的事情是可能的 [0-9^404|401){3}。
    • [^0-9] 否定范围内的所有字符
    • [^...] 将匹配任何单个字符匹配...表达式(包括字符类,例如[^XYZ\s\d]匹配不是空格、不是数字、也不是 X、Y 或 Z 的字符。但它不能与任何其他语法结合来指定诸如“匹配一组字符而不匹配另一组”之类的概念。也就是说,你不能像[\d^4] 这样说“匹配一个数字但不匹配'4'
    • [^404] 表示除 4,0,4 以外的所有字符
    • 负前瞻更易于阅读和添加值,但如果无法进行负前瞻,这是一个很好的解决方案
    【解决方案3】:

    解释:

    否定前瞻?! 查找与指定模式不匹配的文本。 正向前瞻会查找要匹配但不返回的模式。

    http://www.regular-expressions.info/lookaround.html

    • ?! 不匹配以下 模式
    • 404|401 要么是 404 要么是 401,所以 | 用于替代品

    【讨论】:

    • 但是这个“?!”查看 401|404 模式还是 \d{3} 模式?
    • 我不完全确定,但我认为它就像一个没有反向引用的子表达式,当它没有找到 404 或 401 时它是成功的,所以匹配很好,它会继续其余的.如果它确实找到其中之一,则匹配失败并且它停止而不执行 3 位搜索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多