@Quqas

Как в javascript игнорировать   и(или) считать его простым пробелом?

Редактирую скрипт на поиск и замену\чистку строк текста на странице

сначала задаём что искать и чем менять

window.addEventListener('load', function() {
    'use strict';

    // create a TreeWalker of all text nodes
var allTextNodes = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT),
    // some temp references for performance
    tmptxt,
    tmpnode,
    // compile the RE and cache the replace string, for performance
    text1 = /тут длинная строка. слова разделены пробелами/g,
    text2 = /тут другая строка. слова разделены пробелами/g,
********************
    replaceValue = "другой текст",
    ClearText = "";


потом меняем

// iterate through all text nodes
while (allTextNodes.nextNode()) {
    tmpnode = allTextNodes.currentNode;
    tmptxt = tmpnode.nodeValue;
    tmpnode.nodeValue = tmptxt.replace(text1, replaceValue);
    tmpnode = allTextNodes.currentNode;
    tmptxt = tmpnode.nodeValue;
    tmpnode.nodeValue = tmptxt.replace(text2, ClearText );

}
}, false);


оно работает если на страницах text1 и text2 пишутся 1к1. и не работает если вместо пробела   сунуто, но по факту же это тоже пробел.
как обойти?

+ может есть вариант поэлегантней чем повторять
tmpnode = allTextNodes.currentNode;
 tmptxt = tmpnode.nodeValue;
?

по факту строк поиска не 2 и не 22, а уже под сотню

так же проблема которую не могу обойти если текст идёт в обычных скобках (
т.е. в тексте используются скобки, а js их на свой счёт принимает.
та же чушь если * в тексте.
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
может есть вариант поэлегантней чем повторять

Конечно есть:
while (allTextNodes.nextNode()) {
    replaceNodeText(allTextNodes.currentNode, text1, replaceValue);
    replaceNodeText(allTextNodes.currentNode, text1, ClearText);
}

function replaceNodeText(node, search, replaceText) {
  node.nodeValue = node.nodeValue.replace(search, replaceText);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Aetae
@Aetae
Тлен
Вместо конкретно пробелов использовать в регулярках "любой пробельный символ": /\s/.
Скобки надо, очевидно, экранировать: /\(текст\)/.

Можно написать вспомогательную функцию, чтоб вручную не писать страшые вещи типа
/тут\s+длинная\s+строка.\s+слова\s+разделены\s+пробелами/g
:
function spacify(regexp) {
  const { source, flags } = regexp;
  return new RegExp( source.replace(/\s+([*+{?])?/g, (_, mod) => `\\s${mod ?? '+'}`), flags )
}


Либо написать вспомогательную функцию, которая будет заодно и экраировать:
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 
}
function toSpacedRegExp(string, flags = 'g') {
  return new RegExp( escapeRegExp(string).replace(/\s+/g, '\\s+'), flags )
}
// /тут\s+длинная\s+строка\.\s+слова\s+разделены\s+пробелами/g
const text = toSpacedRegExp('тут длинная строка. слова разделены пробелами')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы