如何识别波斯语字符?

How can I detect Persian characters?

本文关键字:波斯语 字符 识别 何识别      更新时间:2023-09-26

让我用一些例子来解释我的问题;

                   // expected result: ("true" means "rlt" and "false" means "ltr")
var test = "..!";  // true
var test = "te";   // false
var test = "!te";  // false
var test = "..ق";  // true
var test = "مب";   // true 
var test = "eس";   // false
var test = "سe";   // true

下面是我当前的代码:

// declare direction of comment in textarea
var x = new RegExp("[A-Za-z]"); // is ascii
var isAscii = x.test($("#textarea-edit-"+post_id_for_edit).val().substring(0, 1));
if(isAscii){
     $("#textarea-edit-"+post_id_for_edit).css("direction", "ltr");
} else {
     $("#textarea-edit-"+post_id_for_edit).css("direction", "rtl");
}

我希望它是基于第一个字符,这是一个字母(波斯语或英语)。但是我的代码是基于第一个字符(它可以是任何字符,甚至是一个符号)

我该怎么做呢?

我建议使用带有ASCII字母和波斯语字母的正则表达式作为交替部分,并且只捕获其中一个(例如ASCII)。如果存在匹配,并且匹配了组1,则文本被标识为ASCII。如果没有匹配,或者匹配成功,但组1不匹配,则文本应为波斯语。

请看下面的代码:

function check(s) {
  var PersianOrASCII = /[آ-ی]|([a-zA-Z])/;
  if ((m = s.match(PersianOrASCII)) !== null) {
    if (m[1]) {
       return false;
    }
    else { return true; }
  }
  else { return true; }
}
  
console.log(check("..!"));  // true
console.log(check("te"));   // false
console.log(check("!te"));  // false
console.log(check("..ق"));  // true
console.log(check("مب"));   // true 
console.log(check("eس"));   // false
console.log(check("سe"));   // true

注意:您可以使用['u0600-'u06FF],甚至['u0600-'u06FF'uFB8A'u067E'u0686'u06AF] regexp来微调波斯语字母正则表达式。甚至['u06A9'u06AF'u06C0'u06CC'u060C'u062A'u062B'u062C'u062D'u062E'u062F'u063A'u064A'u064B'u064C'u064D'u064E'u064F'u067E'u0670'u0686'u0698'u200C'u0621-'u0629'u0630-'u0639'u0641-'u0654](来自persianRex)

波斯语字符位于阿拉伯语Unicode块内,介于U+0600和U+06FF之间。

function contain_persian_char(str){
    var p = /^['u0600-'u06FF's]+$/;
    if (p.test(str)) 
        return true;
    return false;
}

你也可以简单地使用这个库:persianRex

您可以简单地使用这个正则表达式检查,它最初可在perisan-tools:

 const faAlphabet = "ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی";
 const faNumber = "۰۱۲۳۴۵۶۷۸۹";
 const faShortVowels = "َُِ";
 const faOthers = "‌آاً";
 const faMixedWithArabic = "ًٌٍَُِّْٰٔءك‌ةۀأإيـئؤ،";
 const faText = faAlphabet + faNumber + faShortVowels + faOthers;
 const faComplexText = faText + faMixedWithArabic;
const isPersian = (str, isComplex = false, trimPattern = /["'-+()؟'s.]/g) => {
    const text = str.replace(trimPattern, "");
    const faRegex = isComplex ? faComplexText : faText;
    return new RegExp(`^[${faRegex}]+$`).test(text);
};
console.log(isPersian("این یک متن فارسی است؟"));  // true
console.log(isPersian("آیا سیستم میتواند گزینه های دیگری را به اشتباه به عنوان متن فارسی تشخیص دهد؟"));   // true
console.log(isPersian("Lorem Ipsum Test")); // false
console.log(isPersian("これはペルシア語のテキストですか")); //false
console.log(isPersian("Это персидский текст?")); //false
console.log(isPersian("这是波斯文字吗?")); //false
console.log(isPersian("هل هذا نص فارسي؟")); //false
console.log(isPersian("أكد رئيس اللجنة العسكرية الممثلة لحكومة الوفاق الوطني في ليبيا أحمد علي أبو شحمة، أن اللجنة لا تستطيع تنفيذ خطتها لإخراج العناصر الأجنبية من أراضي البلاد.")); //false

我知道这可能很复杂,但这是正确检测persian的正确方法,要看到接受的答案不能正常工作,只需使用我们放在下面的选项进行测试。