2010-08-22 29 views
16

Có cách nào để phát hiện ngôn ngữ của dữ liệu được nhập thông qua trường nhập không?PHP: Làm cách nào để phát hiện xem chuỗi đầu vào có phải là tiếng Ả Rập

+1

Tôi cho rằng bạn có nghĩa là chữ viết tiếng Ả Rập, chứ không phải là tiếng Ả Rập? Có một sự khác biệt lớn. – Rushyo

+2

Nếu chuỗi chứa các từ từ nhiều ngôn ngữ thì sao? Ví dụ: 私 không عرب – Lukman

Trả lời

27

hmm tôi có thể cung cấp một phiên bản cải tiến của chức năng DimaKrasun của:

functoin is_arabic($string) { 
    if($string === 'arabic') { 
     return true; 
    } 
    return false; 
} 

ổn, đủ nói đùa!

Đề xuất của Pekkas sử dụng api dịch google là một ứng dụng tốt! nhưng bạn đang dựa vào một dịch vụ bên ngoài luôn phức tạp hơn, v.v.

tôi nghĩ Rushyos là tốt! nó không dễ dàng. tôi viết hàm sau cho bạn, nhưng nó chưa được thử nghiệm, nhưng nó phải làm việc ...

<? 
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); 
?> 

suy nghĩ cuối cùng: như bạn thấy tôi thêm ví dụ một bộ đếm latin, phạm vi chỉ là một số giả b ut theo cách này, bạn có thể phát hiện bộ ký tự (tiếng do thái, tiếng la tinh, tiếng ả rập, tiếng Hin-ddi, tiếng Trung, v.v ...)

bạn cũng có thể muốn loại bỏ một số ký tự đầu tiên ... có thể @, dấu cách, dấu ngắt dòng, dấu gạch chéo, v.v. .. cờ PREG_SPLIT_NO_EMPTY cho hàm preg_split sẽ hữu ích nhưng vì lỗi mà tôi không sử dụng ở đây.

bạn cũng có thể có một bộ đếm cho tất cả các bộ ký tự và xem cái nào dĩ nhiên nhất ...

và cuối cùng là bạn nên xem xét chặt chuỗi của bạn tắt sau 200 ký tự hoặc một cái gì đó. điều này là đủ để cho biết bộ ký tự nào được sử dụng.

và bạn phải thực hiện một số thao tác xử lý lỗi! như chia cho số không, chuỗi rỗng, v.v. đừng quên điều đó, làm ơn ... bất kỳ câu hỏi nào? bình luận!

nếu bạn muốn phát hiện LANGUAGE của chuỗi, bạn nên chia thành các từ và kiểm tra các từ trong một số bảng được xác định trước. bạn không cần một từ điển hoàn chỉnh, chỉ là những từ phổ biến nhất và nó sẽ hoạt động tốt. tokenization/bình thường hóa là phải là tốt! có thư viện cho anyway đó và đây không phải là những gì bạn yêu cầu :) chỉ muốn đề cập đến nó

+0

Chức năng của bạn khiến đầu tôi mờ đi. Tôi sẽ cố gắng thực hiện nó khi tôi đang ở trong một tâm trạng tốt hơn, và cho bạn biết nếu nó làm việc trên nó. Nhưng từ những gì tôi đọc, có vẻ đầy hứa hẹn. – HyderA

+0

roger đó, đừng quên bao gồm các chức năng uniord bên ngoài trên đầu trang! Tôi biết nếu bạn cần bất kỳ halp nào –

+0

Từ điển là một ý tưởng rất hay, chỉ có vấn đề là ở ngoài kịch bản tiếng Latin, bạn nhanh chóng gặp phải những hoàn cảnh mà bối cảnh bên ngoài thay đổi các ký tự - chẳng hạn như các ký tự multi-glyph. Bạn sẽ phải cẩn thận để tránh các ký tự nhạy cảm với ngữ cảnh trong từ điển của bạn. – Rushyo

1

Tôi không biết giải pháp PHP cho việc này, không.

Tuy nhiên, Google Translate Ajax APIs có thể dành cho bạn.

Check-out đoạn javascript này từ các tài liệu API: Example: Language Detection

+0

Phát hiện tập lệnh là một điều rất khác với phát hiện ngôn ngữ. – Rushyo

+1

@Rushyo tốt, hiện tại, anh ấy đang yêu cầu phát hiện * ngôn ngữ * chứ không phải là tập lệnh. –

+0

Thực hiện nghĩa đen, vâng, nhưng tôi nghi ngờ đó là ý định. – Rushyo

3

Bạn có thể sử dụng chức năng, mà tôi đã viết cho bạn:

<?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); 
} 

Nhưng xin, kiểm tra xem nó, trước khi sử dụng.

[EDIT 1]

Câu hỏi của bạn: "Làm thế nào để phát hiện nếu một chuỗi đầu vào là tiếng Ả Rập" Và tôi đã trả lời nó, điều gì sai?

[EDIT 2]

đọc này - Detect language from string in PHP

[EDIT 3]

Excuse, tôi viết lại chức năng này, hãy thử nó:

function is_arabic($subject) 
{ 
    return (preg_match("/^[\x0600-\x06FF]/i", $subject) > 0); 
} 
+0

"Is Arabic"! = "Contains 'Arabic'" - tiêu đề câu hỏi có thể hơi mơ hồ, nhưng cơ thể câu hỏi thì rõ ràng hơn, phải không? – Piskvor

+1

Nếu chuỗi là arabic, nó có chứa chữ cái arabic hay không? –

+0

Piskvor, Regex của DimaKrasun phải thực sự phát hiện các ký tự tiếng Ả Rập ... không chỉ là chuỗi 'tiếng Ả Rập'. – Rushyo

1

Tôi cho rằng bạn đang đề cập đến một chuỗi Unicode ... trong trường hợp đó, chỉ cần tìm pr esence của bất kỳ ký tự nào có mã giữa U + 0600 – U + 06FF (1536–1791) trong chuỗi.

+0

Bao gồm, để rõ ràng. – Rushyo

+0

điều đầu tiên tôi nghĩ về regex với U + 0600 – U + 06FF, nhưng tiếp theo là sử dụng \ p {Arabic} - trong regex, tôi nghĩ \ p {Arabic} giống với U + 0600 – U + 06FF, nhưng tôi đã không thử nó –

+0

Tôi khá chắc chắn nó là như nhau, nhưng phương pháp này nhanh hơn rất nhiều. – Rushyo

5

này sẽ kiểm tra nếu chuỗi là tiếng Ả Rập Hoặc có văn bản tiếng Ả Rập

văn bản phải được UNICODE ví dụ UTF-8

$str = "بسم الله"; 
if (preg_match('/[أ-ي]/ui', $str)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 
+1

Nó hoạt động hoàn hảo. Cảm ơn bạn rất nhiều! – wpcoder

2
public static function isArabic($string){ 
    if(preg_match('/\p{Arabic}/u', $string)) 
     return true; 
    return false; 
} 
0

Chức năng này kiểm tra xem dòng/câu đã nhập có phải là tiếng Ả Rập hay không. Tôi cắt nó trước rồi kiểm tra từng chữ bằng cách tính tổng số cho cả hai.

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; 
     } 
    } 
Các vấn đề liên quan