JavaScript включает () и игнорирует пробелы, исправляет форматирование кода - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть функция, которая принимает строку (в частности, адрес или почтовый индекс из входных данных), а затем добавляет сильные теги вокруг совпадающих результатов. Он отлично работает, но я бы хотел, чтобы он соответствовал символам, которые не имеют пробелов . Например, если строка ввода cf142, я бы хотел, чтобы она соответствовала CF14 2.

Ниже приведена функция:

emboldenMatch(string, query) {
  query = query.toLowerCase().trim();
  if (string.toLowerCase().includes(query)) {
    const queryLength = query.length;
    const matchIndex = string.toLowerCase().indexOf(query);
    const matchEnd = matchIndex + queryLength;
    const before = string.substr(0, matchIndex);
    const match = string.substr(matchIndex, queryLength);
    const after = string.substr(matchEnd, string.length - matchEnd);  

    return `${before}<strong>${match}</strong>${after}`;
  } else {
    return string;
  }
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Сначала вы можете написать свою существующую функцию следующим образом:

 function emboldenMatch(string, query) {
    return string.replace(query, "<strong>$&</strong>")
}
console.log(em('some string with bold text', 'bold'));

Если вы хотите обернуть каждый матч, а не только первый, и быть нечувствительным, вы можете сделать его regexp и добавить g ( = глобальный) флаг и i (= нечувствительный) флаг:

function emboldenMatch(string, query) {
  return string.replace(new RegExp(escapeRegExp(query), 'gi'), "<strong>$&</strong>")
}
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

console.log(emboldenMatch('some string with bold bold text', 'bold'));

Теперь, если вы хотите добавить дополнительные пробелы между символами, вы можете добавить его в регулярное выражение следующим образом:

function emboldenMatch(string, query) {
    var reg = new RegExp(escapeRegExp(query).split('').join('\\s*'), 'gi');
    return string.replace(reg, "<strong>$&</strong>")
}
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

console.log(emboldenMatch('some string with bo ld  b old text', 'bold'));
0 голосов
/ 07 апреля 2020

Попробуйте:

function emboldenMatch(string, query) {
    query = query.toLowerCase().trim().replace(/ /g,'');
    if (string.toLowerCase().includes(query)) {
      const queryLength = query.length;
      const matchIndex = string.toLowerCase().indexOf(query);
      const matchEnd = matchIndex + queryLength;
      const before = string.substr(0, matchIndex);
      const match = string.substr(matchIndex, queryLength);
      const after = string.substr(matchEnd, string.length - matchEnd);  

      return `${before}<strong>${match}</strong>${after}`;
    } else {
      return string;
    }
  }
  
  console.log(emboldenMatch('asdf2', 'asdf 2'))
  console.log(emboldenMatch('asdf2', 'asdf2'))
...