我编写了以下代码来检查给定的字符串是拉丁语还是包含其他一些非拉丁字符,如波斯语。问题是它总是对以下两个字符串都返回true:
$str = "Hello, What's up?"
或者
$str = "Hello, سلام"
对于第二个字符串,它应该返回false,因为它也包含波斯字符(非拉丁字符)。
$default_rule = "/[a-zA-Z0-9\(\)\*_\-\!\#\$\%\^\&\*\,\.\"\'\]\[]*/";
$rule = ($rule==null) ? $default_rule : $rule;
if(preg_match($rule, $str)==true)
{
// always returns true
}
答案 0 :(得分:5)
如果字符串包含您指定的那些字符的零或更多,则您的模式将返回true。换句话说,对于任何字符串,它将返回true。你需要在它周围放置开始(^
)和结束($
)锚点。此外,您不需要转义大多数这些字符(字符类使它们被视为文字字符):
$default_rule = '/^[a-zA-Z0-9()*_\-!#$%^&*,."\'\][]*$/';
但是,这将匹配一个空字符串。要确保字符串不为空,请使用+
量词(一个或多个)而不是*
。
$default_rule = '/^[a-zA-Z0-9()*_\-!#$%^&*,."\'\][]+$/';