为什么正则[数字字母中文],这样匹配不出来?

这样的字符串:字母_可能是中文数字字母_字母_可能是中文数字字母

$a = “lang_中文_dir_教学”;
//$a = “lang_1_dir_2”;
preg_match_all(‘/[a-za-z]+_[\u4e00-\u9fa5_a-za-z0-9]+$/u’, $a, $arr);
var_dump($arr);

为什么这样没有匹配到

我重新这样写了

$a = “lang_中文_dir_教学”;

preg_match_all(‘/[a-za-z]+_[\x{4e00}-\x{9fa5}\w\w]+/u’, $a, $arr);

var_dump($arr);

为什么还是没能匹配出 lang_中文 和 dir_教学 这2个数组,而是整个都出来了

回复讨论(解决方案)

$a = “lang_中文_dir_教学”;
preg_match_all(‘/[a-za-z]+_[\x{4e00}-\x{9fa5}]+/u’, $a, $arr);
var_dump($arr);

array(1) {
[0]=>
array(2) {
[0]=>
string(9) “lang_中文”
[1]=>
string(8) “dir_教学”
}
}

因为+是贪婪匹配

[\u4e00-\u9fa5_a-za-z0-9]+

这个东东会匹配 中文 和 _ 和 字母数字,并且一直匹配到最后,

你可以用非贪婪匹配,就是加一个问号

preg_match_all(‘/[a-za-z]+_[\u4e00-\u9fa5_a-za-z0-9]+?$/u’, $a, $arr);

楼上写错了,你的正则还加了 $ 强制匹配到字符串结尾,应该去掉$,再加上问号

preg_match_all(‘/[a-za-z]+_[\u4e00-\u9fa5_a-za-z0-9]+?/u’, $a, $arr);

$a = “lang_中文_dir_教学”;
preg_match_all(‘/[a-za-z]+_[\x{4e00}-\x{9fa5}]+/u’, $a, $arr);
var_dump($arr);

array(1) {
[0]=>
array(2) {
[0]=>
string(9) “lang_中文”
[1]=>
string(8) “dir_教学”
}
}

这个只能匹配中文的,有数字或者字母的时候还是无法匹配

楼上写错了,你的正则还加了 $ 强制匹配到字符串结尾,应该去掉$,再加上问号

preg_match_all(‘/[a-za-z]+_[\u4e00-\u9fa5_a-za-z0-9]+?/u’, $a, $arr);

没有效果,utf8编码下无效 ,[\x{4e00}-\x{9fa5}] 这个可以匹配中文。

Posted in 未分类