Jquery делает поиск в массиве с учетом регистра без учета регистра - PullRequest
0 голосов
/ 30 января 2020

У меня есть function, который проверяет, содержит ли текстовая область строку :tag: во время набора. Если да, то он заменяет его на [tag] [/tag]. Например, если мы введем :b:, он вставит [b] [/b].

Это хорошо работает, но я хочу, чтобы это работало, даже если мы будем использовать верхний регистр. Как и при наборе :B:, можно также вставить [b] [/b] (или [B] [/B], на самом деле не имеет значения), но, как бы я ни пытался, это просто не работает.

Естественно, ему нужно работать с каждый тег .

$("textarea").on("input",function(e){
        let textarea=$(this);
        let text = textarea.val();
        let target=e.target;
        let position=target.selectionStart;

        let tags=["B","I","U","S","Q",
        "H1","H2","H3","H4","H5","H6",
        "LEFT","CENTER","RIGHT","SUB","SUP",
        "H","HR","CODE","SPOILER","UL","OL","LI"];

        $.each(tags, function(index, tag) {
            tag=tag.toLowerCase();
            let fullTag=":"+tag+":";
            if(textarea.val().toLowerCase().indexOf(fullTag) > -1 ){
                textarea.val(text.replace(fullTag, "["+tag+"]    [/"+tag+"]"));
                target.selectionEnd=position+2;
            }
        });
     });
textarea{
  width:200px;
  height:100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea></textarea>

Мне кажется, что ответ на самом деле прост, и я много искал, пробовал много вариантов, но все еще не могу понять , Поэтому я буду признателен, если вы поможете мне с этим.

1 Ответ

1 голос
/ 30 января 2020

Из массива tags я бы вместо этого построил регистрозависимое регулярное выражение, а в функции replacer проверил бы индекс совпадения во всей строке (последний аргумент), чтобы определить, где установить новое selectionEnd:

const tags = ["B", "I", "U", "S", "Q",
  "H1", "H2", "H3", "H4", "H5", "H6",
  "LEFT", "CENTER", "RIGHT", "SUB", "SUP",
  "H", "HR", "CODE", "SPOILER", "UL", "OL", "LI"
];
const pattern = new RegExp(tags.map(tag => `:${tag}:`).join('|'), 'i');
$("textarea").on("input", function(e) {
  let usedIndex = null;
  this.value = this.value.replace(
    pattern,
    (match, index) => {
      const tag = match.match(/\w+/)[0];
      usedIndex = index + tag.length + 4;
      return `[${tag}]    [${tag}]`
    }
  );
  if (usedIndex) {
    this.selectionEnd = usedIndex;
  }
});
textarea {
  width: 200px;
  height: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea></textarea>
...