2012-03-22 103 views
4

我想让中文,日文(平假名,片假名,汉字),韩文,以及基本上任何unicode字母。我只想把第一个字符作为字母只接受使用preg_match的UTF8字母

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

但是我的模式似乎接受前面带有数字的字符串。当我补充说:

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

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

+0

您的测试字符串包含除字母,数字,ASCII空间,ASCII下划线,ASCII期间和ASCII短划线之外的任何内容吗? – 2012-03-22 21:04:30

回答

2

这应该做的伎俩:

<?php 

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

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

var_dump($valid); 
+4

替代模式,也将工作:/^\ p {L} +/iu – 2012-03-22 21:03:07

+1

这只会检查第一个字符是否是一个字母,没有更多。 (而'{1,'')是不雅的 - 这就是'+'量词的用法,b)没有用处,因为只要至少有一个字母在一开始就匹配多少个字母无关紧要。所以你可以放弃它) – 2012-03-22 21:06:38

+0

@TimPietzcker同意;尽管我确实展示了+量词作为第一个注释:) - >但是你是正确的,这不是必须的,但它显示了一个更加明确的故事。去除量词至多是微观优化,最坏的情况是,对于已经在语法上挣扎的人来说,这是一种不必要的混淆。我会在这种情况下与可读性:) – 2012-03-22 22:03:42

相关问题