如何检测波斯字符?

时间:2016-08-14 23:15:18

标签: javascript jquery regex

让我通过一些例子解释我的问题;

                   // 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");
}

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

那我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

我建议使用带有ASCII字母和波斯语字母regexps的正则表达式作为替换部分,并且只捕获其中一个(例如,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)。

答案 1 :(得分:1)

波斯语字符在阿拉伯语Unicode块中,在U + 0600和U + 06FF之间。

function contain_persian_char(str){
    var p = /^[\u0600-\u06FF\s]+$/;

    if (p.test(str)) 
        return true;
    return false;
}

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

答案 2 :(得分:0)

您可以简单地使用带有正则表达式检查的箭头函数,就像 perisan-tools 提供的此代码段一样简单:

const isPersian = (str, trimPattern = /[-+()\s.]/g) =>
    /^[\u0600-\u06FF\s]+$/.test(str.replace(trimPattern, ""));

const hasPersian = (str) => /[\u0600-\u06FF]/.test(str);

您可以根据需要进行调整。

const isPersian = (str, trimPattern = /[-+()\s.]/g) =>
    /^[\u0600-\u06FF\s]+$/.test(str.replace(trimPattern, ""));

const hasPersian = (str) => /[\u0600-\u06FF]/.test(str);

//--------------examples-------------------
console.log(isPersian(""),isPersian("asdas"),isPersian("."),isPersian("شسیشسی"),isPersian("شیش سی "),isPersian("شیش. سی "),isPersian("شیش. سdddddی` "),isPersian("中國人"),isPersian("?"));
// false false false true true true false false false


console.log(hasPersian(""),hasPersian("asdas"),hasPersian("."),hasPersian("شسیشسی"),hasPersian("شیش سی "),hasPersian("شیش. سی "),hasPersian("شیش. ddddddسی "),hasPersian("中國人"),hasPersian("?"));
// false false false true true true true false false