Как использовать подобный текст PHP-код на арабском языке
Пытаюсь использовать php similar_text()
с арабским, но это не работает. Однако он отлично работает с английским языком.
<?php
$var = similar_text("ياسر","عمار","$per");
echo $var;
?>
outbot : 5
это неверный результат, он должен быть 2. Есть ли similar_text()
с арабскими буквами?
3 ответа
Поскольку арабский текст является многобайтовой строкой, обычные функции PHP использовать нельзя (например, "Similar_text()").
echo(strlen("عمار"));
Вышеприведенный код выводит: 8
echo(mb_strlen("عمار", "UTF-8"));
Используя функцию mb_strlen с указанной кодировкой UTF-8, получим: 4 (правильное количество символов).
Вы можете использовать функции mb_ для создания собственной версии функции Similar_text: http://php.net/manual/en/ref.mbstring.php
Вот один я использую
//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
Просто для протокола и, надеюсь, чтобы помочь, я хочу уточнить поведение 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
в этом случае (каждые две шестнадцатеричные цифры представляют байт.)