0

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

当前代码是

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

但这会阻止 utf8 符号,在我的情况下是 åæø。

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

4

3 回答 3

0

--enable-unicode-properties如果您安装了 PCRE,您可以查找 unicode 字母,\p{L}而不是\w

请参阅 PHP 站点http://uk1.php.net/manual/en/regexp.reference.unicode.php上正则表达式中有关 unicode 字符的文档

于 2013-05-24T15:18:47.480 回答
0

添加 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 有效性。

于 2013-05-24T15:19:40.503 回答
0

我已经重写了您的正则表达式模式,因为我认为您不想包含\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',
)
于 2017-04-21T06:04:14.883 回答