php美元金额正则表达式

时间:2010-05-12 21:08:55

标签: php regex

我已经使用正则表达式完成了对表单的javascript验证,现在正在使用PHP进行冗余验证服务器端。

我从我的jscript代码中复制了这个正则表达式,找到了美元值,并将其改为PHP友好格式:

/\$?((\d{1,3}(,\d{3})*)|(\d+))(\.\d{2})?$/

具体做法是:

if (preg_match("/\$?((\d{1,3}(,\d{3})*)|(\d+))(\.\d{2})?$/", $_POST["cost"])){}

虽然表达式在javascript中很有效但我得到了:

Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 1

当我在PHP中运行它时。任何人都知道为什么会出现这个错误?

3 个答案:

答案 0 :(得分:2)

你必须双倍逃避$。

if (preg_match("/\\\$?((\d{1,3}(,\d{3})*)|(\d+))(\.\d{2})?$/", $_POST["cost"])){}

只是把\ $将让php从启动变量中逃脱$。您还必须在前面添加另一个转义的\(\\)。或者你可以只使用单引号,因此php不会将$解释为变量的开头。

答案 1 :(得分:1)

来自PHP文档:

  

如果你这样做,请不要使用preg_match()   只想检查一个字符串是否   包含在另一个字符串中使用   strpos()strstr()代替他们   会更快。

答案 2 :(得分:1)

试试这个:

if (preg_match('/\$?((\d{1,3}(,\d{3})*)|(\d+))(\.\d{2})?$/', $_POST["cost"])){}

“之间的美元符号”被视为变量的开头。与这两个代码片段进行比较:

1:

$var = "hello";
echo "$var world";

2:

$var = "hello";
echo '$var world';