我有以下正则表达式:
/^[A-Za-z0-9-_ãÃñÑéÉêÊúÚíÍáÁõÕàÀèÈìÌòÒùÙçü.#()+=%$&?¿@!\s]+$/
出于某种原因,“é”字符允许传递“©”字符传递。 怎么了?
答案 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