我在网页上有一个巨大的PHP输入框。此输入应仅使用逗号分隔的5位数字符串:
00100,00247,90277,97030,00657
注意最后一个最后没有逗号。
是否有可以执行此操作的正则表达式?由于输入框非常大并且可以使用其中的100多个项目,因此我想在查询数据库之前在PHP服务器端验证它,并避免任何SQL注入尝试。
只有序列中只有5个数字和逗号才会运行查询,但最后一个除外。 顺便说一下,这是州的公共供水系统ID。
答案 0 :(得分:7)
我相信这会得到你正在寻找的结果,虽然爆炸可能是更好的选择。
/^(?:\d{5},)*\d{5}$/
这只会匹配一个或多个以逗号分隔且没有空格的5位数字。
答案 1 :(得分:3)
由于这是用户提交的数据,因此您的验证应该更加灵活。如果用户意外地在其中一个逗号之后放置空格怎么办?或插入换行符?
我意识到你正在寻找一个正则表达式解决方案,但我可以建议使用explode创建一个数组并将规则应用于每个元素。将它们分成元素可以在验证和存储时提供更大的灵活性:
$nums = explode(',', '00100,00247,90277,97030,00657');
foreach ($nums as $num) {
if (!preg_match('/^\d{5}$)/', trim($num))) {
// error!
}
}
答案 2 :(得分:0)
我会爆炸并单独验证每个字符串:
$input = '00100,00247,90277,97030,00657';
$input_array = explode(',', $input);
$is_valid = true;
foreach ($input_array as $number) {
if (preg_match("/\\d/", trim($number)) != strlen(trim($number))) {
$is_valid = false;
}
}
print($is_valid);
答案 3 :(得分:0)
我认为您需要str_getcsv
:
while ($row = str_getcsv($fp)) {
// $row is an array containing your digits
}
答案 4 :(得分:0)
简单。此正则表达式匹配具有一个或多个逗号分隔的5位数字的值:
if (preg_match('/^\d{5}(\s*,\s*\d{5})*$/', $value)) {
// Good value
}
它也允许数字之间的空格。
答案 5 :(得分:0)
这可能有效:
/^\d{5}(?:,\d{5})*$/
编辑1 注意到ridgerunner有相同的答案,所以请不要理会。 p>
编辑2 关于效果的一些注意事项。
回溯回复失败:
^\d{5}(?:,\d{5})*$
返回,\d{5}
^(?:\d{5},)*\d{5}$
返回\d{5},
回溯后回归地形检查:
(回溯后回复,检查是在回复的权利的右边)
^\d{5}(?:,\d{5})*$
检查$
^(?:\d{5},)*\d{5}$
检查\d{5}$
获奖者: ^ \ d {5}(?:,\ d {5})* $
非回溯正则表达式(使用积极量词+
):
^\d{5}(?:,\d{5})*+$
没有给予任何回报,立即失败
^(?:\d{5},)*+\d{5}$
没有任何回复立即失败
使用50个\d{5},
块的字符串。
样本字符串与每个正则表达式匹配,循环次数为100,000次
在弦的最后引起失败,移除进行成功测试。
<强> Sucess:强>
所有人都花了 1 秒来完成一次成功的运行。
失败,回溯:
^\d{5}(?:,\d{5})\*$
1.2 秒最佳
^(?:\d{5},)\*\d{5}$
1.6 秒
失败,非回溯:
^\d{5}(?:,\d{5})*+$
.9 秒
^(?:\d{5},)*+\d{5}$
.9 秒
回溯 - 放置最小的回溯后检查
在回溯子表达式之后。在这种情况下,
最小的是$
通常,将可选的表达式提前
最佳 ^ \ d {5}(?:,\ d {5})* $
非回溯 - 没关系。
^\d{5}(?:,\d{5})*+$
或^(?:\d{5},)*+\d{5}$