带有regexp的PHP filter_var验证超出预期

时间:2016-04-11 22:13:25

标签: php regex

我尝试使用PHP的filter_var函数来验证上传的CSV中的某些输入。

我使用的几个值不属于内置验证过滤器,所以我转向了FILTER_VALIDATE_REGEXP。

我在PHP中得到的结果与我http://regex101.com/的结果不同,在那里我一直在玩,以确保我的模式正确。

我的问题是PHP中有一些非常基本的模式对我不起作用,filter_var允许字符串通过它似乎与我的模式不匹配。

一些例子:

php > $regex = array("options" => array("regexp"=>"/[a-z]+/","default"=>"false"));
php > echo filter_var("123", FILTER_VALIDATE_REGEXP, $regex);
false //this is expected
php > echo filter_var("abcd", FILTER_VALIDATE_REGEXP, $regex);
abcd //this is also expected
php > echo filter_var("abcd$", FILTER_VALIDATE_REGEXP, $regex);
abcd$ //this is the problem

在我责怪PHP被破坏之前,我倾向于发现自己对正则表达式的理解,但我真的无法弄清楚特殊字符(和数字)是如何偷偷溜过这个过滤器的。我在这里处理一个错误吗?

FWIW,我正在运行PHP 5.3.3,phpinfo()告诉我它正在使用捆绑的正则表达式库。

首先,如果我遗漏了任何重要细节,我会道歉。 谢谢!

3 个答案:

答案 0 :(得分:2)

因为您已经传递了abcd,所以正常传递此字符串。你必须使用$ sign来断言字符串末尾的位置。并且还使用^符号来开始字符串。

^[a-z]+$

如果您使用%asdasd或asdasd $或$ asdasd $,它将无法匹配 请参阅:https://regex101.com/r/vO1iI1/4

答案 1 :(得分:0)

正则表达式过滤器通过,因为正则表达式匹配字符串的一部分。这是唯一的要求。任何带有单个字母的字符串都会通过。您需要通过将正则表达式更改为/^[a-z]+$/来指定要匹配整个字符串。 ^告诉PHP匹配字符串的开头,$告诉它匹配结尾。这意味着您要求从开始到结束的整个字符串与[a-z]+匹配。

答案 2 :(得分:0)

使用FILTER_VALIDATE_REGEXP需要输入匹配。在您的情况下,您匹配任何包含[a-z]+ 某处的字符串。如果你想确保,整个字符串必须匹配你的正则表达式,你必须锚定正则表达式的开始/结束。

有两个锚点。

^匹配字符串的开头。因此^[a-z]+将匹配任何字符串,该字符串以至少一个alpha char开头。

$匹配字符串的结尾。因此[a-z]$将匹配任何字符串,该字符串以至少一个alpha字符结尾。

如果将这两个锚点组合在一起,就可以获得所需的正则表达式。

^[a-z]+$