【发布时间】:2011-02-25 21:14:23
【问题描述】:
我有这个代码
preg_match("/\bHTTP(.)+ (\d{3})/", $string)
在最后一个模式中,我必须检查一个可以由任何数字组成的 3 位数字,但不应创建像 404 或 401 这样的数字,我该怎么做?
【问题讨论】:
标签: php regex numbers preg-match regex-negation
我有这个代码
preg_match("/\bHTTP(.)+ (\d{3})/", $string)
在最后一个模式中,我必须检查一个可以由任何数字组成的 3 位数字,但不应创建像 404 或 401 这样的数字,我该怎么做?
【问题讨论】:
标签: php regex numbers preg-match regex-negation
您可以使用否定前瞻断言来确保匹配的字符串没有404 或401 as:
preg_match("/\bHTTP(.+) (?!404|401)(\d{3})/", $string)
【讨论】:
你想要排除的值越多,这会变得越复杂,但是
preg_match("/\bHTTP(.+) ([0-35-9]\d{2}|4[1-9]\d|40[0235-9])/", $string)
将匹配任何不以 4 开头的三位数字,
或任何以 4 开头但不以 40 开头的三位数字,
或任何以 40 开头但不是 401 或 404 的三位数字。
【讨论】:
[^...] 将匹配任何单个字符不匹配...表达式(包括字符类,例如[^XYZ\s\d]匹配不是空格、不是数字、也不是 X、Y 或 Z 的字符。但它不能与任何其他语法结合来指定诸如“匹配一组字符而不匹配另一组”之类的概念。也就是说,你不能像[\d^4] 这样说“匹配一个数字但不匹配'4'。
解释:
否定前瞻?! 查找与指定模式不匹配的文本。
正向前瞻会查找要匹配但不返回的模式。
http://www.regular-expressions.info/lookaround.html
?! 不匹配以下
模式404|401 要么是 404 要么是 401,所以 | 用于替代品【讨论】: