2015-06-23 26 views
2

嘗試使用帶有阿拉伯語的php similar_text(),但它不起作用。 然而,它與英文很好。如何在阿拉伯語中使用類似文本的php代碼

<?php 
$var = similar_text("ياسر","عمار","$per"); 
echo $var; 
?> 
outbot : 5 

這是錯誤的結果,應該是2,是否有similar_text()與阿拉伯字母?

+0

只有變量可以通過傳遞[參考](http://php.net/references)!所以,你需要去掉函數最後一個參數中'$ per'的雙引號:) – someOne

回答

0

因爲阿拉伯文字是多字節字符串,所以不能使用普通的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

1

只是爲了記錄並希望做出一些幫助,我想澄清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的原因(每兩個十六進制數字代表一個字節)。

1

這裏有一個我使用

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