var与regexp验证超出预期

我正在尝试使用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()告诉我它正在使用捆绑的正则表达式库。

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


因为你已经通过abcd所以它正常传递这个字符串。 您必须使用$符号来声明字符串末尾的位置。 并且还使用^符号来开始字符串。

^[a-z]+$

因此,如果您使用%asdasd或asdasd $或$ asdasd $,它就不会匹配。请参阅:https://regex101.com/r/vO1iI1/4


正则表达式筛选器因为正则表达式匹配部分字符串而通过。 这是唯一的要求。 任何即使是单个字母的字符串也会通过。 您需要通过将正则表达式更改为/^[az]+$/来指定要匹配整个字符串。 ^告诉PHP匹配字符串的开始,并且$告诉它匹配结束。 这意味着你要求整个字符串[az]+匹配[az]+


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

有两个锚点给你。

^匹配字符串的开头。 因此^[az]+会匹配任何以至少一个字母字符开头的字符串。

$匹配字符串的结尾。 所以[az]$会匹配任何以至少一个字符结尾的字符串。

如果你结合这两个锚点,你会得到你想要的正则表达式。

^[az]+$

链接地址: http://www.djcxy.com/p/16541.html

上一篇: var with regexp validates more than expected

下一篇: var in php 5.3.8