【问题标题】:preg_replace() optional pattern matchingpreg_replace() 可选模式匹配
【发布时间】:2014-04-16 19:12:38
【问题描述】:

我想使用 preg_match() 在 PHP 上做一些模式匹配。我希望我的用户从他们的移动设备输入一个金额。所以如果他们想输入 50.50,他们可以输入 50*50(这里的星号是手机上的实际星号按钮)。所以我想检查一些验证的输入。主要是 1.所有输入必须是数字(不包括星号) 2. 星号后的小数点位数应为两位。 3.小数位可选。这意味着用户可以输入 50 或 50.50 都应该是有效的。

到目前为止,我所拥有的是这个。 if( preg_match( "_\d{1,6}(\*\d{2})_" , $input) {//do something}。此代码部分工作,问题是我无法使子模式搜索成为可选。我查看了手册,但找不到任何东西。我需要帮助谢谢你

【问题讨论】:

  • +1 用于使用非标准分隔符。更多的人需要意识到 PHP 可以做到这一点 XD 就我个人而言,我使用括号是因为它们成对出现,因此永远不需要转义“仅仅因为它是分隔符”。
  • 我不认为它的分隔符有问题。
  • 我没说是。我发现你知道使用不同的分隔符是值得称赞的。

标签: php regex preg-match


【解决方案1】:

) 之后添加? 使其成为可选。 ? 用作量词意味着“零或一” - 即。可选。

顺便说一句,我不知道有任何移动设备有浏览器,但不允许您轻松输入....

【讨论】:

  • 可能是 90 年代的手机。
  • 感谢您的回复。实际上它不是一个网络应用程序。它是一个 USSD 软件脚本。我尝试了你的建议,但它仍然通过小数点后两位以上的输入(星号)
  • 啊,对了,在开头和结尾(就在分隔符内)使用^$ 来匹配整个字符串。
  • 好的,我已经尝试了您的两个建议,但它似乎不起作用。您可以发布代码(您解释过的)吗?
  • "(^\d{1,6}(\*\d{2})?$)"
【解决方案2】:
$array = array("50.50", "50", "50*50", "4");

foreach($array as $number)
{
if (preg_match('/^[\d]{2}(\.|\*)?([\d]{2})?/sim', $number)) {
    echo $number ." VALID ";
} else {
    echo $number ." INVALID ";
    //Do something with the invalid number
}
}

输出:50.50 VALID 50 VALID 50*50 VALID 4 INVALID

DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多