2013-07-30 59 views
2

如何在for循環中將中文與英文字符分開?php中文與英文字符分開

這是代碼:

<!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

把'的preg_match()'在一個循環是一個非常糟糕的主意:這是非常緩慢的。我建議使用'preg_replace()' – HamZa

+0

@HamZa,'preg_replace'用於替換。我認爲這裏的問題是因爲漢字需要兩個字符空間。 – sheno

+0

[說什麼?](https://eval.in/39753):) – HamZa

回答

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;