我使用preg_match作为验证表单输入的方法。具体来说,我正在尝试验证货币的输入。这是功能:
if (preg_match("/^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$/i", $inString)) {
return True;
} else {
return False;
}
我可以让它全部工作。无论我喂它什么(包括有效字符串),我都会一直返回False。我确定我做了一些明显错误的事情,但我无法看到它。你知道它是怎么回事......
有人有任何建议吗?
答案 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"
显然,在这种情况下使用单引号更简单。