正则表达式接受不应该的字符

时间:2018-03-23 03:55:59

标签: php regex

我有以下正则表达式:

/^[A-Za-z0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$/

出于某种原因,“é”字符允许传递“©”字符传递。 怎么了?

2 个答案:

答案 0 :(得分:1)

UTF-8字符是多字节的。表达式是对字符的字面解释,在这种情况下,“é”等于“Ô。要获得准确的解释,请使用“(* UTF8)”:

/(*UTF8)^[A-Za-z0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$/

我在这里找到答案:http://php.net/manual/pt_BR/function.preg-match.php#95828

答案 1 :(得分:1)

您可以更简单地将u模式修改器添加到模式的末尾,效果相同。此外,我建议您使用\w来压缩您的模式,代表任何字母,数字或下划线。相当于 [a-zA-Z0-9 ] _

建议模式:~^[-\wãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$~u

代码:(Demo

$in = "AZ a-z\t0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü\r\n.#()+=%$&?¿@!©";  // string contains ©
echo preg_match('~^[A-Za-z0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$~', $in, $out) ? $out[0] : 'fail';

echo "\n\nNow with a unicode flag...\n";
echo preg_match('~^[-\wãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$~u', $in, $out) ? $out[0] : 'fail';
//  this is shorter--^^                            here is the magic--^

输出:(第一种模式并非按照©的意图失败,第二种模式确实如此。)

AZ a-z  0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü
.#()+=%$&?¿@!©

Now with a unicode flag...
fail