8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

volkerschulz 2月前

42 0

我正在尝试用 PHP 编写一个合理宽松的名称验证器,我的第一次尝试包括以下模式:// unicode 字母、撇号、连字符、空格$namePattern = \'/^([\\...

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

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

这最终被传递给对 的调用 preg_match() 。据我所知,这适用于普通的 ASCII 字母表,但似乎会遇到更复杂的字符,如 Ă 或 。

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

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

帖子版权声明 1、本帖标题:在 PCRE/PHP 中匹配 Unicode 字母字符
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由volkerschulz在本站《regex》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我认为问题比这简单得多:您忘记指定 u modifier 。Unicode 字符属性 仅在 UTF-8 模式下可用 .

    你的正则表达式应该是:

    // unicode letters, apostrophe, hyphen, space
    $namePattern = '/^[-\' \p{L}]+$/u';
    
  • 很奇怪。尝试 $namePattern = '/^[\pL]$/'; $a = ''; var_dump(preg_match($namePattern, $a)); $a = '1'; var_dump(preg_match($namePattern, $a)); 和变体。它确实对我有用,即使没有 u。PHP 5.3.2-1ubuntu4.7

  • 是的,我使用了答案中显示的 utf8ToUnicode 例程来验证文件中的代码点。

  • @chx:如果是那样的话,我就不知道了。如果没有修饰符,它对我来说不起作用,但有了修饰符就可以了。由于 PHP 没有适当的多字节支持,因此编码问题很常见。

  • 是的,就像添加 u 一样简单。后续问题:u 究竟表示什么?由于没有 u 的模式仍然匹配 ASCII,我猜它告诉正则表达式一些有关输入字符串性质的信息,而不是模式本身。

  • 如果你想用 Unicode 替换它, old pattern 这样 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 或更高版本开始可用,在 win32 上从 PHP 4.2.3 开始可用。自 PHP 4.3.5 起,将检查模式的 UTF-8 有效性。

    谢谢 AgreeOrNot 谁给我这个密钥 preg_replace 匹配阿拉伯语中的整个单词

    我尝试了一下,它在本地主机上工作,但是当我在远程服务器上尝试它时它不起作用,然后我发现 php.net u 在 PHP 4.3.5 中启动使用修饰符。,我升级了 php 版本并且它工作了

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

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

  • 如果其他人在这里查看却无法使其工作,请注意, /u 跨不同 PHP 版本的 Unicode 脚本不会产生一致的结果。

    查看示例: https://3v4l.org/4hB9e

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

  • 首先,如果您在编写这些内容时使用单撇号而不是双引号,您的生活会轻松很多——您只需要一个反斜杠。其次, \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 字符表吗?

  • Fynn 2月前 0 只看Ta
    引用 10
    <?php preg_match('/[a-zığüşöç]/u',$title)  ?>
    
返回
作者最近主题: