我在修改旧的preg_match代码时遇到问题。
目前的代码是
if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) {
但在我的案例中,这会阻止utf8标志。
验证它们的最简单方法是什么?
答案 0 :(得分:0)
如果使用--enable-unicode-properties
安装了PCRE而使用\p{L}
代替\w
请参阅PHP网站http://uk1.php.net/manual/en/regexp.reference.unicode.php上的正则表达式中的unicode字符文档
答案 1 :(得分:0)
添加u修饰符http://php.net/manual/en/reference.pcre.pattern.modifiers.php
你是(PCRE_UTF8):此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。从PHP 4.3.5开始检查模式的UTF-8有效性。
答案 2 :(得分:0)
我已经重写了你的正则表达式模式,因为我不认为你想要包含\w
附带的数字。我添加了大量的重音字母,应该涵盖您可能遇到的所有斯堪的纳维亚字符。
我删除了empty()
的测试,因为正则表达式模式至少需要1个字符。
要查看字符表及其unicode编号,请访问https://unicode-table.com/en/
您可以在此Demo查看和试验我的正则表达式模式,以确保包含项目的所有有效字符。
这是我的PHP Demo - 对于测试一些实际的输入名称也很有用。
测试代码:
$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',
)