这样的字符串:字母_可能是中文数字字母_字母_可能是中文数字字母
$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}] 这个可以匹配中文。