【问题标题】:What regex can I use to validate a number between 0 and 255?我可以使用什么正则表达式来验证 0 到 255 之间的数字?
【发布时间】:2011-09-27 10:49:21
【问题描述】:

我想验证 0-255 范围内的数字

我有这个表情

'/^([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5])$/'

但这接受任何数字... 这有效:

'/(^[0-1]?[0-9]?[0-9]$)|(^[2][0-4][0-9]$)|(^25[0-5]$)/'

为什么每个选项都必须有 ^ 和 $?

编辑:我有,但我无法回答我的问题,所以 - ^$ 的优先级高于 |,所以 /^(...)$/ 有帮助

【问题讨论】:

  • 其实你可以自己回答问题...
  • 你真的应该接受@alex'的回答!
  • 它告诉我,我可以在 7 小时或类似的时间后回答我自己的问题,可能是因为我是新来的

标签: php regex validation pcre


【解决方案1】:

不要使用正则表达式来验证数字范围。

只需使用条件...

if ($number >= 0 AND $number <= 255) {
   ...
}

这将确保数字在 0 到 255 之间(含),这就是您的正则表达式正在做的事情。

要具体回答您的问题,它不起作用,因为您需要使用捕获组包装整个内容,否则正则表达式引擎将对每个单独的正则表达式执行 OR... p>

/^([0-1]?[0-9]?[0-9]|[2][0-4][0-9]|25[0-5])$/

另请注意,$ 将在任何尾随 \n 之前匹配。如果你真的想在字符串的末尾匹配,请使用\z

【讨论】:

  • @Ivan:将文本转换为数字。你可以使用intvalphp.net/manual/en/function.intval.php
  • @Felix:是的,但无论如何我都必须使用另一个 pcre 从文本中提取数字,所以为什么不在表达式中验证它呢?好吧,也许它要慢得多....
  • @IvanStana: 好的,如果你有几行文本并且其中一些行只包含数字(必须在 0 到 255 之间),那么是的,正则表达式更好......但是如果整个字符串只是一个数字,那么intval 就可以了。无论如何,只有你知道输入,我假设你知道你在做什么;)
  • 谢谢大家的每一个回答,我想我从中学到了一些新东西:-)
【解决方案2】:

注意: @alex's answer 是要走的路。使用正则表达式验证数字范围就像使用手提钻捉苍蝇一样。

但我还是想为这个“问题”提供一个解释。


您不必这样做,只需正确分组即可,这意味着您必须对交替进行分组:

'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^                                             ^

否则表达式将被解释如下(逻辑上)

(^number) OR (number) OR (number$)

加上括号,就是

^(number OR number OR number)$

【讨论】:

  • ...用手提钻捉苍蝇。我必须有一天尝试一下! :P
  • @alex:我不确定这是否真的是好的措辞(我不是以英语为母语的人;))。我敢肯定有一个合适的英语谚语。但只要你喜欢我就很好;)
  • 你的英语写得比我认识的很多人都写得好,他们都是第一语言。太棒了!
【解决方案3】:

另一种方法(但我认为以前的解决方案更好)

in_array($number, range(0, 255))

【讨论】:

  • 我想过在我的答案中包含这个,但是对于一些非常简单的事情来说它有点开销。不过,+1 替代答案:)
【解决方案4】:

首先,我同意@Alex 的回答是可行的方法;然而,值得一提的是,正则表达式版本可以使用更简洁的模式来完成:

/^([01]?\d{1,2}|2([0-4]\d|5[0-5]))$/

...当数字解析不是一个选项时我使用的。

【讨论】:

    【解决方案5】:

    我进一步使用它,这里是严格的 0-255 范围的正则表达式,不允许前导零:

    '/^([0]|[1-9]\d?|[1]\d{2}|2([0-4]\d|5[0-5]))$/'

    【讨论】:

      【解决方案6】:

      [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]

      会起作用

      【讨论】:

        【解决方案7】:

        ^(([0-9]|[1-9][0-9])|[1][0-9][0-9]|[2][0-5][0-5])$ 这适用于 0-255,表示没有前导零,例如 001

        【讨论】:

          【解决方案8】:

          我知道这个问题已经得到解答,但我需要一个类似的正则表达式来进行页面路由; 1-66 的范围除外。这很好用: /^(?!67|68|69)[1-6][0-9]|[1-9]$/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-31
            • 1970-01-01
            • 1970-01-01
            • 2015-07-15
            • 1970-01-01
            相关资源
            最近更新 更多