хм, я могу предложить улучшенную версию функции ДимаКрасуна:
functoin is_arabic($string) {
if($string === 'arabic') {
return true;
}
return false;
}
хорошо, хватит шутить!
Предложение Pekkas использовать API Google Translate является хорошим! но вы полагаетесь на внешний сервис, который всегда более сложен и т. д.
я думаю, что подход Rushyos хорош! это просто не так просто.
я написал следующую функцию для вас, но она не проверена, но она должна работать ...
<?
function uniord($u) {
// i just copied this function fron the php.net comments, but it should work fine!
$k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
$k1 = ord(substr($k, 0, 1));
$k2 = ord(substr($k, 1, 1));
return $k2 * 256 + $k1;
}
function is_arabic($str) {
if(mb_detect_encoding($str) !== 'UTF-8') {
$str = mb_convert_encoding($str,mb_detect_encoding($str),'UTF-8');
}
/*
$str = str_split($str); <- this function is not mb safe, it splits by bytes, not characters. we cannot use it
$str = preg_split('//u',$str); <- this function woulrd probably work fine but there was a bug reported in some php version so it pslits by bytes and not chars as well
*/
preg_match_all('/.|\n/u', $str, $matches);
$chars = $matches[0];
$arabic_count = 0;
$latin_count = 0;
$total_count = 0;
foreach($chars as $char) {
//$pos = ord($char); we cant use that, its not binary safe
$pos = uniord($char);
echo $char ." --> ".$pos.PHP_EOL;
if($pos >= 1536 && $pos <= 1791) {
$arabic_count++;
} else if($pos > 123 && $pos < 123) {
$latin_count++;
}
$total_count++;
}
if(($arabic_count/$total_count) > 0.6) {
// 60% arabic chars, its probably arabic
return true;
}
return false;
}
$arabic = is_arabic('عربية إخبارية تعمل على مدار اليوم. يمكنك مشاهدة بث القناة من خلال الموقع');
var_dump($arabic);
?>
последние мысли:
как вы видите, я добавил, например, латинский счетчик, диапазон - это просто фиктивное число, но таким образом вы можете обнаружить кодировки (иврит, латинский, арабский, хинди, китайский и т. д.)
вы также можете сначала удалить некоторые символы ... может быть, @, пробел, переносы строк, слэши и т. Д. ...
флаг PREG_SPLIT_NO_EMPTY для функции preg_split был бы полезен, но из-за ошибки я не использовал его здесь.
вы также можете иметь счетчик для всех наборов символов и посмотреть, какой из них, конечно, самый ...
и, наконец, вы должны подумать о том, чтобы отрезать свою строку после 200 символов или чего-то еще. этого должно быть достаточно, чтобы сказать, какой набор символов используется.
и вам нужно выполнить обработку ошибок! как деление на ноль, пустая строка и т. д. и т. д.! не забудь это, пожалуйста ... есть вопросы? комментарий!
Если вы хотите определить ЯЗЫК строки, вам следует разбить ее на слова и проверить наличие слов в некоторых заранее определенных таблицах. вам не нужен полный словарь, только самые распространенные слова, и он должен работать нормально. токенизация / нормализация также необходима! В любом случае, для этого есть библиотеки, и это не то, о чем вы просили :) просто хотел упомянуть об этом