【问题标题】:Problems with preg_matchpreg_match 的问题
【发布时间】:2014-07-26 23:53:41
【问题描述】:

我使用 preg_match 作为验证表单输入的一种方式。具体来说,我正在尝试验证货币的输入。这是函数:

if (preg_match("/^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$/i", $inString)) {
    return True;
} else {
    return False;
}

我可以让它工作。无论我提供什么(包括有效字符串),我都会一直返回 False。我确定我在做一些明显错误的事情,但我看不到它。你知道它是怎么回事...

大家有什么建议吗?

【问题讨论】:

  • 你能显示你的$inString值吗?

标签: php regex preg-match


【解决方案1】:

试试这样的:

$inString = '1550.50';

if (preg_match("/\b\d{1,3}(?:,?\d{3})*(?:\.\d{2})?\b/", $inString)) {
    echo "True"; 
} else {
    echo "False";
}

解释:

\b      # word boundary assertion
\d{1,3} # 1-3 digits
(?:     # followed by this group...
 ,?     # an optional comma
 \d{3}  # exactly three digits
)*      # ...any number of times
(?:     # followed by this group...
 \.     # a literal dot
 \d{2}  # exactly two digits
)?      # ...zero or one times
\b      # word boundary assertion

【讨论】:

  • 速度快得惊人,现在完美运行。我显然需要复习我的正则表达式...谢谢!
  • @SpencerX -- 我为你投了赞成票,但要小心,我的理解是版主不同意要求 OP 接受一个人的回答。
【解决方案2】:

preg_match 函数已经根据是否匹配返回 True 或 False,因此无需再次返回 True 或 False。

这意味着您可以直接回显 True 或 False 的值:

$inString = "$12.50";
$price_regex = '~^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$~';
echo preg_match($price_regex, $inString);
// echoes 1

你也可以直接返回这些值:

return preg_match($price_regex, $inString);

您可以执行布尔测试:

if( preg_match($price_regex, $inString) ) { // take some action }
else { // take another action }

如果您想要的是根据是否存在匹配来回显某个值,请执行以下操作:

echo (preg_match($price_regex, $inString)) ? "**It Matches!**" : "Nah... No match." ;

注意事项:

  • 将分隔符更改为~(更清晰)
  • 删除了i 标志(没有字母,因此不需要区分大小写)

【讨论】:

    【解决方案3】:

    在此工作之前给出了两个答案,但这里解释了为什么原始 preg_match 模式没有工作。

    这是因为模式用双引号括起来。当 PHP 看到这一点时,它会将 $ 符号后面的任何内容视为变量名。如果您需要在双引号字符串中包含文字 $ 符号,则美元必须以反斜杠开头。

    所以这两种模式都有效:

    '/^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$/i' "/^\\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}\$/i"

    显然,在这种情况下使用单引号更简单。

    【讨论】:

    • 谢谢,这也很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多