在 PCRE/PHP 中匹配 Unicode 字母字符

问题描述 投票:0回答:5

我正在尝试为 PHP 中的名称编写一个相当宽松的验证器,我的第一次尝试包括以下模式:

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

这最终会传递给对

preg_match()
的调用。据我所知,这适用于您的香草 ASCII 字母表,但似乎会遇到 Ă 或张等更刺激的字符。

模式本身有问题吗?也许我期待

\p{L}
比我想象的做更多的工作?

或者它与输入的传递方式有关?我不确定它是否相关,但我确实确保在表单页面上指定了 UTF8 编码。

php regex unicode pcre character-properties
5个回答
32
投票

我认为问题比这简单得多:您忘记指定

u
修饰符。 Unicode 字符属性仅在 UTF-8 模式下可用

你的正则表达式应该是:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';

1
投票

如果你想用

old pattern
替换 Unicode
new pattern
你应该写:

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);

所以这里的关键是

u
修饰符

注意:你的服务器

php version
应该至少是
PHP 4.3.5

如这里所述php.net |模式修饰符

u (PCRE_UTF8) 此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式字符串被视为 UTF-8。这 Unix 上的 PHP 4.1.0 或更高版本以及 PHP 提供修饰符 4.2.3 在 win32 上。自 PHP 4.3.5 起检查模式的 UTF-8 有效性。

谢谢

AgreeOrNot
谁给我那个钥匙preg_replace用阿拉伯语匹配整个单词

我试过了,它在本地主机上工作,但是当我在远程服务器上尝试它时,它没有工作,然后我发现 php.net 开始在 PHP 4.3.5 中使用

u
修饰符。 ,我升级了 php 版本并且它有效

重要的是要知道这种方法对阿拉伯语用户 (عربي) 非常有帮助,因为 - 我相信 - unicode 是阿拉伯语的最佳编码,如果不使用

u
修饰符,替换将不起作用,请参阅下一个例子它应该对你有用

$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);


0
投票

首先,如果您在编写这些内容时使用单撇号而不是双引号,您的生活将会轻松得多——您只需要一个反斜杠。其次,还应包括组合标记

\pM
。如果您发现不匹配的字符,请找出它的 Unicode 代码点,然后您可以使用 http://www.fileformat.info/info/unicode/ 找出它的位置。我发现 http://hsivonen.iki.fi/php-utf8/ 在使用 UTF-8 属性进行调试时是一个非常有用的工具(在尝试查找之前不要忘记转换为十六进制:
array_map('dechex', utf8ToUnicode($text))
)。

例如,Ă 结果是 http://www.fileformat.info/info/unicode/char/0102/index.htm 并且在 Lu 中,所以 L 应该匹配它并且它确实匹配我。另一个字符是 http://www.fileformat.info/info/unicode/char/5f20/index.htm 也是 isLetter 并且确实适合我。你有编译的 Unicode 字符表吗?


0
投票

任何其他看这里但没有让它工作的人,请注意

/u
不会在不同 PHP 版本的 Unicode 脚本中产生一致的结果。

参见示例:https://3v4l.org/4hB9e

相关:不同 PHP 版本泰语字符的不一致正则表达式结果


-2
投票
<?php preg_match('/[a-zığüşöç]/u',$title)  ?>
© www.soinside.com 2019 - 2024. All rights reserved.