【问题标题】:Match number if greater than zero如果大于零,则匹配数字
【发布时间】:2014-01-29 20:10:46
【问题描述】:

我使用下面的PCRE 表达式和preg_match 来检查我想要的值是否是数字。

(?P<id>[\d]+)

它有效,但现在我希望它匹配相同的条件,除非整个内容等于 0(零)。

示例结果

1    valid
10   valid
0    invalid

表达式上下文

#^(?P<controller>.*?|home)(?:/(?P<action>.*?|index)(?:/(?P<id>[\d]+))?)?$#uD

【问题讨论】:

  • 请把整个表情也贴出来。另外,你的问题很不清楚。您能否举例说明这将应用于哪种字符串、期望的结果是什么以及当前的结果是什么?

标签: php regex pcre


【解决方案1】:

你可以试试这个吗?

#^(?P<controller>home)(?:/(?P<action>index)(?:/(?P<id>[1-9][\d]*))?)?$#uD

在您的示例中,仅使用数字,它首先匹配,因此显然 0 被捕获。假设您的匹配字符串比这更复杂,在这种情况下,“1-9 一次和 0-9 0 次或更多次”应该为您完成。

见:http://regex101.com/r/yK6mR5

【讨论】:

  • 不起作用,甚至验证不应该验证的字符。
  • @yoda 你需要提供一些样本来匹配,因为你的第一个 捕获匹配所有内容(尽管不是贪婪的)。
  • 正确 - 这行得通。不确定你是否可以在你的场景中做到这一点。您也不需要像这样的显式长度([1-9] 将仅匹配 1 个字符,[0-9]* 匹配 0 个或更多字符。不过,如果您有 000000001,这不足之处 - 这将是一个假阴性.
  • @anubhava 为您解决了问题。根据您的标准,它可以工作。
  • 已更新。澄清一下,这只适用于home/index 路径,没有别的。
【解决方案2】:

你可以使用这个正则表达式:

^(?!0+$)(?P<id>\d+)$

在线演示:http://regex101.com/r/dB2eT3

更新:

工作正则表达式:

'#^(?P<controller>[^/]*|home)(?:/(?P<action>[^/]*|index)(?:/(?!0+$)(?P<id>\d+))?)?$#'

【讨论】:

  • 你能解释一下为什么这不起作用吗,请看这个演示链接:regex101.com/r/nY6nV9
  • 考虑到整数值,我不希望它有前导零或整个值为零,所以任何大于零的数字。
  • 是的,它就是这么做的,你查看了演示吗?它允许任何大于 0 的数字。
  • 它只能脱离上下文,子模式&lt;id&gt;没有被使用。
  • 那是因为你的正则表达式是错误的,尤其是。你在哪里使用.*? 查看工作代码演示:regex101.com/r/gR2bS8
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2018-07-08
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多