PHP preg_match utf8(scandinavian chars)

时间:2013-05-24 15:15:23

标签: php regex preg-match

我在修改旧的preg_match代码时遇到问题。

目前的代码是

if (empty($name) || preg_match('#[^\w-\'\"\s]#si', $name)) {

但在我的案例中,这会阻止utf8标志。

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

3 个答案:

答案 0 :(得分:0)

如果使用--enable-unicode-properties安装了PCRE而使用\p{L}代替\w

,则可以查找unicode字母

请参阅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',
)