PHP: как определить, является ли входная строка арабской
есть ли способ определить язык вводимых данных через поле ввода?
9 ответов
хмм я могу предложить улучшенную версию функции DimaKrasun:
functoin is_arabic($string) {
if($string === 'arabic') {
return true;
}
return false;
}
ладно, хватит прикалываться!
pekkas предложение использовать Google translate api является хорошим! но вы опираетесь на внешнюю службу, которая всегда сложнее и т. д.
Я думаю, что rushyos approch хорошо! это не так просто. я написал для вас следующую функцию, но ее не тестировал, но она должна работать...
<?
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);
?>
Заключительные мысли: как видите, я добавлен, например, латинский счетчик, диапазон - это просто фиктивное число b ut таким образом, вы можете обнаружить кодировки (иврит, латинский, арабский, хинди, китайский и т. д...)
вы также можете сначала устранить некоторые символы... возможно @, пробел, разрывы строк, косые черты и т. д... флаг PREG_SPLIT_NO_EMPTY для функции preg_split был бы полезен, но из-за ошибки я не использовал его здесь.
вы также можете иметь счетчик для всех наборов символов и посмотреть, какой из них, конечно, наиболее...
и, наконец, вы должны рассмотреть возможность отрезать строку после 200 символов или что-то в этом роде. этого должно быть достаточно, чтобы сказать, какой набор символов используется.
и вы должны сделать некоторую обработку ошибок! как деление на ноль, пустая строка и т. д.! не забывайте об этом, пожалуйста... есть вопросы? комментарий!
Если вы хотите определить язык строки, вы должны разбиться на слова и проверить слова в некоторых предопределенных таблицах. вам не нужно полное словарь, только самые распространенные слова, и он должен работать нормально. токенизация / нормализация также является обязательным! есть библиотеки для этого в любом случае и это не то, что вы просили :) просто хотел упомянуть его
это проверит, является ли строка арабской или имеет арабский текст
текст должен быть UNICODE e.G UTF-8
$str = "بسم الله";
if (preg_match('/[أ-ي]/ui', $str)) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
вы можете использовать функцию, которую я написал для вас:
<?php
/**
* Return`s true if string contains only arabic letters.
*
* @param string $string
* @return bool
*/
function is_arabic($string)
{
return (preg_match("/^\p{Arabic}/i", $string) > 0);
}
но пожалуйста, проверите его, перед использованием.
[EDIT 1]
Ваш вопрос: "Как определить, является ли входная строка арабской?- И я ответил на него: что случилось?
[EDIT 2]
читать это - обнаружение языка из строки в PHP
[EDIT 3]
Извините, я переписываю функцию для этого попробуйте:
function is_arabic($subject)
{
return (preg_match("/^[\x0600-\x06FF]/i", $subject) > 0);
}
public static function isArabic($string){
if(preg_match('/\p{Arabic}/u', $string))
return true;
return false;
}
Я не знаю PHP для этого, нет.
на Google Перевести Ajax API может быть для вас.
проверьте этот фрагмент Javascript из документов API:Пример: Распознавание Языка
Я предполагаю, что вы имеете в виду строку Unicode... в этом случае просто найдите наличие любого символа с кодом между U+0600–U+06FF (1536-1791) в строке.
PHP библиотека Text_LanguageDetect может обнаружить 52 языка. Он тестируется и устанавливается с помощью composer и PEAR.
используйте регулярное выражение для более короткого и простого ответа
$is_arabic = preg_match('/\p{Arabic}/u', $text);
это вернет true (1) для арабской строки и 0 для неарабской строки
эта функция проверяет, является ли введенная строка/предложение арабский или нет. Сначала я обрезал его, затем проверил слово за словом, вычисляя общее количество для обоих.
function isArabic($string){
// Initializing count variables with zero
$arabicCount = 0;
$englishCount = 0;
// Getting the cleanest String without any number or Brackets or Hyphen
$noNumbers = preg_replace('/[0-9]+/', '', $string);
$noBracketsHyphen = array('(', ')', '-');
$clean = trim(str_replace($noBracketsHyphen , '', $noNumbers));
// After Getting the clean string, splitting it by space to get the total entered words
$array = explode(" ", $clean); // $array contain the words that was entered by the user
for ($i=0; $i <= count($array) ; $i++) {
// Checking either word is Arabic or not
$checkLang = preg_match('/\p{Arabic}/u', $array[$i]);
if($checkLang == 1){
++$arabicCount;
} else{
++$englishCount;
}
}
if($arabicCount >= $englishCount){
// Return 1 means TRUE i-e Arabic
return 1;
} else{
// Return 0 means FALSE i-e English
return 0;
}
}