我已经使用正则表达式完成了对表单的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中运行它时。任何人都知道为什么会出现这个错误?
答案 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';