preg_match的问题

时间:2014-07-26 23:53:41

标签: php regex preg-match

我使用preg_match作为验证表单输入的方法。具体来说,我正在尝试验证货币的输入。这是功能:

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

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

有人有任何建议吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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标记(没有字母,所以它不需要不区分大小写)

答案 2 :(得分:1)

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

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

所以这两种模式都有效:

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

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