Есть ли способ определить язык данных, вводимых через поле ввода?
PHP: Как определить, является ли входная строка арабской
Ответ 1
hmm Я могу предложить улучшенную версию функции DimaKrasun:
functoin is_arabic($string) {
if($string === 'arabic') {
return true;
}
return false;
}
ладно, шутка!
Предложение Pekkas использовать google translate api - хороший! но вы полагаетесь на внешнюю службу, которая всегда сложнее и т.д.
Я думаю, что 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);
?>
окончательные мысли: как вы видите, я добавил, например, латинский счетчик, диапазон - это просто фиктивный номер b ut таким образом, что вы можете обнаружить кодировки (иврит, латинский, арабский, хинди, китайский и т.д.).
вы также можете устранить некоторые символы сначала... возможно @, пробел, разрывы строк, слэши и т.д.... флаг PREG_SPLIT_NO_EMPTY для функции preg_split будет полезен, но из-за ошибки я не использовал его здесь.
вы также можете иметь счетчик для всех наборов символов и посмотреть, какой из них, конечно, самый...
и, наконец, вы должны рассмотреть возможность измельчения строки после 200 символов или чего-то еще. этого должно быть достаточно, чтобы указать, какой набор символов используется.
и вам нужно выполнить некоторую обработку ошибок! как деление на ноль, пустую строку и т.д. и т.д.! не забывайте, что пожалуйста... любые вопросы? комментарий!
если вы хотите обнаружить ЯЗЫК строки, вы должны разделить на слова и проверить слова в некоторых заранее определенных таблицах. вам не нужен полный словарь, просто самые распространенные слова, и он должен работать нормально. токвизиция/нормализация тоже обязательна! для этого есть библиотеки, и это не то, о чем вы просили:) просто хотел упомянуть об этом
Ответ 2
это проверит, является ли строка арабской или имеет арабский текст
текст должен быть UNICODE, например, UTF-8
$str = "بسم الله";
if (preg_match('/[اأإء-ي]/ui', $str)) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
Ответ 3
Вы можете использовать функцию, которую я написал для вас:
<?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);
}
Но, пожалуйста, проверьте его перед использованием.
[ИЗМЕНИТЬ 1]
Ваш вопрос: "Как определить, является ли входная строка арабским?" И я ответил на это, что не так?
[ИЗМЕНИТЬ 2]
Прочитайте это - Обнаружение языка из строки в PHP
[ИЗМЕНИТЬ 3]
Извините, я переписал функцию, попробуйте:
function is_arabic($subject)
{
return (preg_match("/^[\x0600-\x06FF]/i", $subject) > 0);
}
Ответ 4
Я не знаю о PHP-решении для этого, нет.
Google Translate API Ajax может быть для вас.
Отметьте этот фрагмент Javascript из документов API: Пример: обнаружение языка
Ответ 5
Я предполагаю, что вы ссылаетесь на строку Unicode... в этом случае просто найдите наличие любого символа с кодом между U + 0600-U + 06FF (1536-1791) в строке.
Ответ 6
public static function isArabic($string){
if(preg_match('/\p{Arabic}/u', $string))
return true;
return false;
}
Ответ 7
PHP Библиотека Text_LanguageDetect может обнаруживать 52 языка. Он тестируется и устанавливается с помощью композитора и PEAR.
Ответ 8
Используйте регулярное выражение для короткого и простого ответа
$is_arabic = preg_match('/\p{Arabic}/u', $text);
Это вернет true (1) для арабской строки и 0 для не арабской строки
Ответ 9
Эта функция проверяет, является ли введенная строка/предложение арабической или нет. Сначала я обрезал его, затем проверял слово за словом, вычисляя общее количество для обоих.
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;
}
}
Ответ 10
Я бы использовал регулярные выражения, чтобы получить количество арабских символов и сравнить его с общей длиной строки. Если текст, например, содержит не менее 60% арабских символов, я считаю его главным образом арабским и применяю форматирование RTL.
/**
* Is the given text mainly Arabic language?
*
* @param string $text string to be tested if it is arabic. :-)
* @return bool
*/
function ct_is_arabic_text($text) {
$text = preg_replace('/[ 0-9\(\)\.\,\-\:\n\r_]/', '', $text); // Remove spaces, numbers, punctuation.
$total_count = mb_strlen($text); // Length of text
if ($total_count==0)
return false;
$arabic_count = preg_match_all("/[اأإء-ي]/ui", $text, $matches); // Number of Arabic characters
if(($arabic_count/$total_count) > 0.6) { // >60% Arabic chars, its probably Arabic languages
return true;
}
return false;
}
Для встроенного RTL форматирования используйте CSS. Пример класса:
.embed-rtl {
direction: rtl;
unicode-bidi: normal;
text-align: right;
}