我在修改旧的 preg_match 代码时遇到问题。
当前代码是
if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) {
但这会阻止 utf8 符号,在我的情况下是 åæø。
验证它们的最简单方法是什么?
我在修改旧的 preg_match 代码时遇到问题。
当前代码是
if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) {
但这会阻止 utf8 符号,在我的情况下是 åæø。
验证它们的最简单方法是什么?
--enable-unicode-properties
如果您安装了 PCRE,您可以查找 unicode 字母,\p{L}
而不是\w
请参阅 PHP 站点http://uk1.php.net/manual/en/regexp.reference.unicode.php上正则表达式中有关 unicode 字符的文档
添加 u 修饰符http://php.net/manual/en/reference.pcre.pattern.modifiers.php
u (PCRE_UTF8):
此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式字符串被视为 UTF-8。此修饰符在 Unix 上的 PHP 4.1.0 或更高版本以及 win32 上的 PHP 4.2.3 中可用。自 PHP 4.3.5 起检查模式的 UTF-8 有效性。
我已经重写了您的正则表达式模式,因为我认为您不想包含\w
. 我添加了大量重音字母,应该涵盖您可能遇到的所有斯堪的纳维亚字符。
empty()
因为正则表达式模式至少需要 1 个字符,所以我已经删除了测试。
要查看字符表及其 Unicode 编号,请访问https://unicode-table.com/en/
您可以在此演示中查看和试验我的正则表达式模式,以确保您包含项目的所有有效字符。
这是我的PHP 演示——对于测试一些实际输入名称也很有用。
测试代码:
$names=array(
"Fred"=>"Fred",
"T3d"=>"T3d",
"null"=>null,
"empty"=>"",
"Babe The Bambino Ruth"=>'Babe "The Bambino" Ruth',
"Bjorg"=>"Björg",
"Shawniqua"=>"Shawn'iq-ua",
"Abjorn"=>"Åbjørn",
"Mary-Jane"=>"Mary-Jane",
"Will.i.am"=>"Will.i.am",
"AEstrid"=>"Æstrid");
foreach($names as $key=>$name){
if(preg_match('/^[A-Z\x{C0}-\x{2AF}\'"\s-]+$/sui',$name)){
$goodies[]="Valid: $name";
}else{
$errors[]="Invalid/empty name: $key";
}
}
echo "Valids:\n";
var_export($goodies);
echo "\n\nInvalids:\n";
var_export($errors);
输出:
Valids:
array (
0 => 'Valid: Fred',
1 => 'Valid: Babe "The Bambino" Ruth',
2 => 'Valid: Björg',
3 => 'Valid: Shawn\'iq-ua',
4 => 'Valid: Åbjørn',
5 => 'Valid: Mary-Jane',
6 => 'Valid: Æstrid',
)
Invalids:
array (
0 => 'Invalid/empty name: T3d',
1 => 'Invalid/empty name: null',
2 => 'Invalid/empty name: empty',
3 => 'Invalid/empty name: Will.i.am',
)