PHP判断一个UTF-8字符串为纯汉字的两种方法

方法1:

preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str)

原理:
正则匹配中文汉字根据页面编码不同而略有区别 
1.GBK/GB2312编码:[x80-xff]+ 或 [xa1-xff]+ 
2.UTF-8编码:[x{4e00}-x{9fa5}]+/u

方法2:

(mb_strlen($str) > strlen($str)) && (mb_strlen($str) % strlen($str) == 0)

原理:
1、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度一致,可以判断是纯英文字符串。
2、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后不为0,可以判断为是英汉混合的字符串。
3、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后得0可以判断为是全汉字的字符串。

 

测试代码:

$str1 = '1234';
$str2 = '12中国';
$str3 = '伟大中国';
$sPattern = '/^[\x{4e00}-\x{9fa5}]+$/u';
echo '$sPattern: '.$sPattern.EOL.EOL;

echo '$str1: '.$str1.EOL;
echo 'var_dump($sPattern, $str1): '.EOL;
echo var_dump(preg_match($sPattern, $str1)).EOL;
echo 'strlen($str1): '.strlen($str1).EOL;
echo 'mb_strlen($str1): '.mb_strlen($str1).EOL.EOL;

echo '$str2: '.$str2.EOL;
echo 'var_dump($sPattern, $str2): '.EOL;
echo var_dump(preg_match($sPattern, $str2)).EOL;
echo 'strlen($str2): '.strlen($str2).EOL;
echo 'mb_strlen($str2): '.mb_strlen($str2).EOL.EOL;

echo '$str3: '.$str3.EOL;
echo 'var_dump($sPattern, $str3): '.EOL;
echo var_dump(preg_match($sPattern, $str3)).EOL;
echo 'strlen($str3): '.strlen($str3).EOL;
echo 'mb_strlen($str3): '.mb_strlen($str3).EOL.EOL;

//输出结果:
/*
$sPattern: /^[\x{4e00}-\x{9fa5}]+$/u

$str1: 1234
var_dump($sPattern, $str1): 
/private/var/wwwroot/ythl/phper/type/string.php:35:int 0
strlen($str1): 4
mb_strlen($str1): 4

$str2: 12中国
var_dump($sPattern, $str2): 
/private/var/wwwroot/ythl/phper/type/string.php:41:int 0
strlen($str2): 8
mb_strlen($str2): 4

$str3: 伟大中国
var_dump($sPattern, $str3): 
/private/var/wwwroot/ythl/phper/type/string.php:47:int 1
strlen($str3): 12
mb_strlen($str3): 4
*/

 

转载于:https://my.oschina.net/fz04003/blog/1570647

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值