如何在字符串中检测其他语言(非英语)中的字母?

时间:2016-07-22 08:56:42

标签: php regex

这是我的代码:

function isValid($string) {
    return strlen($string) >= 6 &&
           strlen($string) <= 40 &&
           preg_match("/\d/", $string) &&
           preg_match("/[a-zA-Z]/", $string);
}

// Negative test cases
assert(!isValid("hello"));

// Positive test cases
assert(isValid("abcde2"));

如您所见,我的脚本根据4个条件验证字符串。现在我正在尝试开发这个:

preg_match("/[a-zA-Z]/", $string)

此条件仅返回英文字母true。我怎样才能添加其他字母ا ب ث چ。那我该怎么办呢?

注意:这些字符不是阿拉伯语,而是波斯语。

1 个答案:

答案 0 :(得分:1)

要匹配英文或波斯文字,您可以使用

preg_match('/[\x{0600}-\x{06FF}A-Z]/iu', $string)

\x{0600}-\x{06FF}范围是supposed to match all Persian lettersA-Z范围将匹配所有ASCII字母(因为使用了/i不区分大小写的修饰符,所以大写字母都是小写字母)。由于您使用的是Unicode字符,因此/u修饰符是必需的。

此外,在检查Unicode字符串长度时,使用mb_strlen而不是strlen,它将正确计算Unicode代码点。

至于

  

您的密码至少应包含一个字母(该字母可以是任何语言

您需要使用

preg_match('/\p{L}/u', $string)

preg_match('/\p{L}\p{M}*+/u', $string)
             ^^^^^^^^^^^^

将匹配任何字母(即使是后面带有变音符号的字母)。 \p{L}匹配任何基本的Unicode字母,而\p{M}*+将在其后的所有位置匹配0+变音符号。如果未使用匹配值,/\p{L}/u就足以进行检查。