Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP预匹配utf8(斯堪的纳维亚字符)_Php_Regex_Preg Match - Fatal编程技术网

PHP预匹配utf8(斯堪的纳维亚字符)

PHP预匹配utf8(斯堪的纳维亚字符),php,regex,preg-match,Php,Regex,Preg Match,我在修改旧的preg_匹配代码时遇到问题 当前代码为 if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) { 但在我的例子中,这会阻止utf8符号 验证它们的最简单方法是什么?如果PCRE安装了--启用unicode属性,则可以查找unicode字母您使用\p{L}而不是\w 请参阅PHP站点上关于正则表达式中unicode字符的文档,添加u修饰符 u(PCRE\u UTF8): 此修饰符打开与Perl不兼容的PCRE的附加功能

我在修改旧的preg_匹配代码时遇到问题

当前代码为

if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) {
但在我的例子中,这会阻止utf8符号


验证它们的最简单方法是什么?

如果PCRE安装了
--启用unicode属性,则可以查找unicode字母
您使用
\p{L}
而不是
\w

请参阅PHP站点上关于正则表达式中unicode字符的文档,添加u修饰符

u(PCRE\u UTF8):

此修饰符打开与Perl不兼容的PCRE的附加功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP4.1.0或更高版本以及win32上的PHP4.2.3获得。从PHP4.3.5开始检查模式的UTF-8有效性


我重写了您的正则表达式模式,因为我认为您不想包含
\w
附带的数字。我添加了大量重音字母,这些字母应该涵盖你可能遇到的所有斯堪的纳维亚字符

我已经删除了
empty()
的测试,因为正则表达式模式至少需要1个字符

要查看字符表及其unicode编号,请访问

您可以在此处查看并试验我的正则表达式模式,以确保包含项目的所有有效字符

这是我的——对于测试一些实际输入名称也很有用

测试代码:

$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',
)

尝试:`/#[^\w-\'\\\'\s]#si/u'添加
/u
修饰符以启用UTF匹配。/u的问题是,一旦我添加了此修饰符,/u就允许了åæ。但是像preg#u匹配('.[^\P{L}\'\s]#si',$name)这样的符号){仍然给我一个错误应该是小写字母p我已经编辑了我的答案,大写字母p否定。嗨,我将它编辑为小写字母,但仍然给我一个无效字符。如果我添加了åæø,并为utf8添加了u,它现在确实有效,但我的语法是否正确?如果(空($name)| | preg| u匹配('\\\\[^\w-\\'\'\'\\'\s\u]\u]\\\\\\\\\\ si',$name)){你应该从类中删除\u,我认为没有这样的事情,也许可以添加一个\before-preg\u匹配(''.[^\w\-\'\'\\'\\\\\'\s].$name);谢谢你的建议,我实际上也尝试过同样的方法,但在添加时仍然会出现错误。如果(空($name).\124; preg\u匹配('.{{35;[^\ w\-\\\\\\''\\\\\\\\\\'\s]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=“无效/空名称”;}