2

如何在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?
4

1 回答 1

0

问题出在这一行: $char = substr($str, $i, 1);. 由于汉字不占用 1 个字节,因此“损坏”了字符,因此preg_match失败了。

解决方案是使用多字节字符串函数
所以$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;
于 2013-07-30T11:25:59.240 回答