14

我正在尝试为 PHP 中的名称编写一个合理允许的验证器,我的第一次尝试包括以下模式:

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

这最终传递给对 的调用preg_match()。据我所知,这适用于您的香草 ASCII 字母,但似乎与 Ă 或张等更刺激的字符有关。

模式本身有问题吗?也许我期望\p{L}做的工作比我想象的要多?

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

4

5 回答 5

29

我认为问题比这简单得多:您忘记指定u 修饰符。Unicode 字符属性仅在 UTF-8 模式下可用

你的正则表达式应该是:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
于 2011-02-13T09:38:59.520 回答
1

如果你想用你替换 Unicode old patternnew 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 或更高版本以及 win32 上的 PHP 4.2.3 中可用。自 PHP 4.3.5 起检查模式的 UTF-8 有效性。

谢谢AgreeOrNot谁给我那个键preg_replace 匹配阿拉伯语中的整个单词

我试过了,它在 localhost 中工作,但是当我在远程服务器上尝试它时它不起作用,然后我发现 php.netu在 PHP 4.3.5 中开始使用修饰符。,我升级了php版本,它可以工作

重要的是要知道这种方法对阿拉伯语用户(عربي)非常有帮助,因为 - 我相信 - unicode 是阿拉伯语的最佳编码,如果您不使用u修饰符,替换将不起作用,请参阅下一个示例它应该和你一起工作

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

于 2013-10-08T21:42:01.950 回答
0

首先,如果你在写这些时使用单引号而不是双引号,你的生活会容易得多——你只需要一个反斜杠。其次,\pM还应包括组合标记。如果您发现一个字符不匹配,请找出它的 Unicode 代码点,然后您可以使用http://www.fileformat.info/info/unicode/找出它在哪里。在使用 UTF-8 属性进行调试时,我发现http://hsivonen.iki.fi/php-utf8/是一个非常宝贵的工具(在尝试查找之前不要忘记转换为十六进制:)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 字符表?

于 2011-02-13T09:27:06.067 回答
0

任何其他人在这里看但没有让它工作,请注意这/u不会产生与跨不同 PHP 版本的 Unicode 脚本一致的结果。

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

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

于 2020-07-31T07:12:43.023 回答
-1
<?php preg_match('/[a-zığüşöç]/u',$title)  ?>
于 2020-09-28T00:58:38.417 回答