【问题标题】:Accepting only UTF8 letters with preg_matchpreg_match 仅接受 UTF8 字母
【发布时间】:2012-03-22 19:06:01
【问题描述】:

我试图允许中文、日文(平假名、片假名、汉字)、韩文和基本上任何 unicode 字母。我希望第一个字符是一个字母

$pattern = '/\p{L}[\p{L}\p{N} _.-]+/u';
if(!preg_match($pattern, $subuser)){
    //Error
}

但是我的模式似乎接受前面带有数字的字符串。当我添加时:

'/^\p{L}[\p{L}\p{N} _.-]+$/u'

没有接受任何字符串。我曾尝试使用 \p{Hiragana} 等,但没有真正的运气。有人看到我做错了吗?

【问题讨论】:

  • 您的测试字符串是否包含字母、数字、ASCII 空格、ASCII 下划线、ASCII 句点和 ASCII 破折号以外的任何内容?

标签: php regex preg-match


【解决方案1】:

这应该可以解决问题:

<?php

$lines = array('12345', 'w123', 'hello');

$valid = array_filter($lines, function($line){
  return preg_match('/^\p{L}{1,}/iu', $line);
});

var_dump($valid);

【讨论】:

  • 这仅检查第一个字符是否为字母,仅此而已。 (而{1,} 是a)不雅 - 这就是+ 量词的用途和b)没用,因为只要它至少是一个,在开始时匹配多少个字母都没有关系。所以你可以完全放弃它)
  • @TimPietzcker 同意;虽然我确实将 + 量词显示为第一条评论 :) --> 但你是对的,它真的没有必要,但它确实描绘了一个更明确的故事.删除量词充其量是一种微优化,最坏的情况是,对于已经在语法上苦苦挣扎的人来说,这是一种不必要的混淆。在这种情况下,我会考虑可读性:)
  • @TimPietzcker 只是另一个独立的注释。随着他更多地了解正则表达式(我们都在不断地这样做),他无疑会意识到 {1,} 不是必需的,但他会很高兴他知道它的存在以及它的作用。
【解决方案2】:

卫生方面的圣杯:http://htmlpurifier.org/ 它会清除所有数据,并且只允许 utf-8 字符通过。 关于字符的一些推荐阅读:http://htmlpurifier.org/docs/enduser-utf8.html

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多