如何在for
循环中分隔中文和英文字符?
这是代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
function filter_ch($char)
{
return $char;
}
function filter_en($char)
{
return $char;
}
$str='Hello 你怎么样? How are you?';
$english='';
$chinese='';
for ($i=0;$i<strlen($str);$i++)
{
$char = substr($str, $i, 1);
if(preg_match('/\p{Han}+/u', $char))
{//if chinese
$chinese.=filter_ch($char);
}
else
{//if english
$english.=filter_en($char);
}
}
echo 'chinese: '.$chinese.'<br>';
echo 'english: '.$english.'<br>';
?>
</body>
</html>
这是结果:
chinese:
english: english: Hello 你怎么样? How are you?
我想要的结果:
chinese: 你怎么样?
english: Hello How are you?
答案 0 :(得分:0)
问题在于这一行:
$char = substr($str, $i, 1);
。由于中文字符不占用1个字节,因此它“破坏”了字符,因此preg_match
失败了。
解决方法是使用multibyte string functions
因此$char = substr($str, $i, 1);
将成为$char = mb_substr($str, $i, 1, 'UTF-8');
,strlen($str)
将成为mb_strlen($str, 'UTF-8')
。
作为旁注,循环中的preg_match
将减慢脚本速度。所以我建议在没有循环的情况下使用preg_replace()
:
$str = 'Hello 你怎么样? How are you?';
$english = preg_replace(array('/[\p{Han}?]/u', '/(\s)+/'), array('', '$1'), $str);
$chinese = preg_replace(array('/[^\p{Han}?]/u', '/(\s)+/'), array('', '$1'), $str);
echo $english . "\r\n" . $chinese;