嘗試使用帶有阿拉伯語的php similar_text()
,但它不起作用。 然而,它與英文很好。如何在阿拉伯語中使用類似文本的php代碼
<?php
$var = similar_text("ياسر","عمار","$per");
echo $var;
?>
outbot : 5
這是錯誤的結果,應該是2,是否有similar_text()
與阿拉伯字母?
嘗試使用帶有阿拉伯語的php similar_text()
,但它不起作用。 然而,它與英文很好。如何在阿拉伯語中使用類似文本的php代碼
<?php
$var = similar_text("ياسر","عمار","$per");
echo $var;
?>
outbot : 5
這是錯誤的結果,應該是2,是否有similar_text()
與阿拉伯字母?
因爲阿拉伯文字是多字節字符串,所以不能使用普通的PHP函數(比如'similar_text()')。
echo(strlen("عمار"));
上面的代碼輸出:8
echo(mb_strlen("عمار", "UTF-8"));
使用與所指定的UTF-8編碼的mb_strlen功能,輸出是:4(正確的字符數)。
可以使用MB_功能,使你自己的similar_text功能的版本:http://php.net/manual/en/ref.mbstring.php
只是爲了記錄並希望做出一些幫助,我想澄清similar_text()
功能的行爲時,一些給出了多字節字符串(包括阿拉伯語的字符串)。
函數簡單地將輸入字符串的每個字節視爲單個字符(這意味着它既不支持多字節字符也不支持Unicode。)
عمار
和ياسر
字符串的字節流分別表示如下(使用.
分隔字節(十六進制表示)中的字節,並且在到達字符的末尾時,則使用:
代替):
06.39:06.45:06.27:06.31 <-- Byte stream for عمار
|| || || || ||
06.4A:06.27:06.33:06.31 <-- Byte stream for ياسر
正如你所知道的,有五個匹配,這就是爲什麼該功能在這種情況下返回5
的原因(每兩個十六進制數字代表一個字節)。
這裏有一個我使用
//from http://www.phperz.com/article/14/1029/31806.html
function mb_split_str($str) {
preg_match_all("/./u", $str, $arr);
return $arr[0];
}
//based on http://www.phperz.com/article/14/1029/31806.html, added percent
function mb_similar_text($str1, $str2, &$percent) {
$arr_1 = array_unique(mb_split_str($str1));
$arr_2 = array_unique(mb_split_str($str2));
$similarity = count($arr_2) - count(array_diff($arr_2, $arr_1));
$percent = ($similarity * 200)/(strlen($str1) + strlen($str2));
return $similarity;
}
所以
$var = mb_similar_text('عمار', 'ياسر', $per);
output: $var = 2, $per = 25
只有變量可以通過傳遞[參考](http://php.net/references)!所以,你需要去掉函數最後一個參數中'$ per'的雙引號:) – someOne