regex 当有波斯字符时,我如何改变文本区域的方向?

yfwxisqw  于 2023-04-07  发布在  其他
关注(0)|答案(3)|浏览(121)

下面是我的代码:

$("body").on('input', 'textarea', function() {
  
      var el  = $(this);
      var len = el.val().length;
  
      if (len <= 1){
	    var x = new RegExp("[A-Za-z]"); // is ascii
	    var isAscii = x.test(el.val().substring(0, 1));
	    if(isAscii){
	    	el.css("direction", "ltr");
	    } else {
	    	el.css("direction", "rtl");
	    }
    }
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>dynamic direction</textarea>

我现在的代码改变了这样一个文本区域的方向,它是基于第一个字符

  • 如果第一个字符是波斯语字符或符号,它将rlt方向设置为该文本区域。
  • 如果第一个字符是英语字符,它将lrt方向设置为该文本区域。

这不是我想要的,我想要的是:

  • 如果第一个字母*(非符号)* 是英语字母,则设置文本区域ltr方向,否则设置为rtl

下面是一些例子:

var test = "..!";    // rtl
var test = "te";     // ltr
var test = "!te";    // ltr
var test = "..ق";    // rtl
var test = "مب";     // rtl
var test = "eس";     // ltr
var test = "سe";     // rtl
var test = "^سe";    // rtl
var test = ".32eس";  // ltr

我该怎么做?

h9a6wy2h

h9a6wy2h1#

如果我正确阅读了问题,目标是如果第一个非符号/符号/标点字符是ASCII字符,则从左到右阅读文本,否则从右到左阅读。
我认为你所需要做的就是修改正则表达式,首先匹配0个或多个符号/符号/标点符号,然后测试下一个字符是否是ASCII字符。
正则表达式[-!$%^&*()_+|~={}[]:";'<>?,./]是一个相当完整的用于符号/符号/标点符号的正则表达式,可以在这里找到:[https://stackoverflow.com/a/8359631/4132627](https://stackoverflow.com/a/8359631/4132627)。您可能需要添加到它,因为你认为合适的。 两个字符组之间的*表示“匹配前一个字符组的0或更多”。 我已经用这个正则表达式更新了你的代码片段,它看起来像预期的那样工作。还删除了长度检查,因为无论有多少个字符,它都需要运行。 这可能并不完美-有许多情况可能被遗漏了。您可能需要稍微尝试一下。例如,第二个字符组是否也应该包括数字([A-Za-z0-9]`)?
无论如何,我希望这有帮助!

$("body").on('input', 'textarea', function() {
  
      var el  = $(this);
      var len = el.val().length;
  
      //if (len <= 1){
    	    var x = /^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]*[A-Za-z]/; // is ascii
  	  	    var isAscii = x.test(el.val());

		    if(isAscii){
		    	el.css("direction", "ltr");
		    } else {
		    	el.css("direction", "rtl");
	  	  }
    	//}
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>dynamic direction</textarea>
x6492ojm

x6492ojm2#

你可以有一个波斯语数组,或者任何从右到左的字母,然后使用.inArray()函数检查数组中是否存在第一个字母,类似于这样:
jsFiddle

var persianLetters = ['آ ', 'ا', 'ب', 'پ', 'ت', 'ث','ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز' , 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ' ,'ل', 'م', 'ن', 'و', 'ه', 'ى'];

$("#ta").on('input', function() {
  
    var el  = $(this);
    var txt = el.val();
    var len = txt.trim().length;
  
    if (len <= 1){
	    var x = txt.substring(0, 1);

        // if the letter is not in the array, the $.inArray() will return -1          
        console.log($.inArray(x, persianLetters));
        
	    if($.inArray(x, persianLetters) > -1){
      	    el.css("direction", "rtl");
        } else {
      	    el.css("direction", "ltr");
        }
    }      
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<textarea name="txt" id="ta" cols="30" rows="10"></textarea>
klr1opcd

klr1opcd3#

我使用这个实用的CSS类,它会根据内容的首选方向自动改变方向:

.direction-auto *,
.direction-auto {
    text-align: start;
    unicode-bidi: plaintext;
}

相关问题