PHP:日语字符验证:为什么平假名字符验证了片假名字符的正则表达式?

时间:2015-02-23 12:46:12

标签: php regex validation utf-8 preg-match

我想验证用户的输入是否为全宽片假名字符?

以下是根据类别

的一组日文字符

http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml

现在看下面的代码,我试图验证,不同的输入

$pattern包含所有全宽片假名字符

header('Content-Type: text/html; charset=utf-8');
        $pattern = "/^([゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ]+)$/";
        $values = array("ナカ" , 
                        "ね",
                        "PHP",
                        "ナカPHP",
                       );

        foreach ($values as $value){
            echo $value. "  =>  ";
            if(preg_match($pattern, $value)){
                echo "valid";
            }else{
                echo "invalid";
            }
            echo "<br>";
        }

$values数组中的第1个值是有效的全宽片假名,第2个是平假名,第3个和第4个是无效的条目。

我得到了以下输出。

ナカ => valid
ね => valid
PHP => invalid
ナカPHP => invalid

关注的是为什么平假名字符被验证,这个问题存在于许多平假名字符,而需要只有全宽KataKana

先谢谢。

2 个答案:

答案 0 :(得分:2)

就像我在评论中所说,你需要打开unicode修饰符u。请注意,当您处理unicode字符时,您必须启用unicode修饰符u

$pattern = "/^([゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ]+)$/u";
                                                                                                                                                           ^

答案 1 :(得分:-2)

我的回答。我将为任何文本定义

$partten = '/^([\x{30A0}-\x{30FF}]+)$/u';
preg_match($partten, $values);