preg_match不允许希腊字符

时间:2014-01-13 23:29:24

标签: php regex preg-match

请参阅下面的注册表:

$teststring="αβγδεζηθΙκΛμ";

if(!preg_match("/^[A-ZA-zΑ-Ωα-ωίϊΐόάέύϋΰήώ0-9\- ]+$/", $teststring))
{
    echo "invalid char";
}
else
{
    echo "success";
}

由于

2 个答案:

答案 0 :(得分:2)

你有几个重叠的字符范围,看起来你正试图测试整个字符串,以确保它只匹配那些字符?你会以这种方式得到很多假阴性。如果您在成功的preg_match上返回“成功”,这可能会有效,但仍然是一种倒退的方式。

此外,如果要匹配unicode字符,则需要/u修饰符才能将字符串视为UTF-16。如果您愿意,也可以使用Unicode range or block代替广泛的范围;你还需要/u

工作表达式,如果字符串的所有字符仅在该范围内,则该字符串将有效:

<?php

$teststring="ΑαβγδεζηθΙκΛμ";
if(preg_match("/^[A-Za-z0-9α-ωΑ-Ω ίϊΐόάέύϋΰήώ-]+$/u", $teststring))
//                                           ^ note the unescaped hyphen is an
//                                             actual hyphen not a char range
{
    echo "success";
}
else
{
    echo "invalid char";
}

?>

您还会注意到,如果您在没有/u修饰符的情况下进行尝试,则会收到以下错误:

Warning: preg_match(): Compilation failed: range out of order in character class at offset {line_num}

答案 1 :(得分:1)

请记住使用分号:

<?php

$teststring="αβγδεζηθΙκΛμ";

if (!preg_match("/^[A-ZA-zΑ-Ωα-ωίϊΐόάέύϋΰήώ0-9\- ]+$/", $teststring)) {
    echo "invalid char"; # Semicolon was missing from here
}
else {
    echo "success"; # Semicolon was missing from here
}

http://ideone.com/Ylmh0H