Anonymous
let re = /прекрасная строка/gi; let str = "Моя прекрасная строка. И еще одна."; for(let r; r = re.exec(str); ) { console.log(r.join(" - "), r.index) }
Maksym
Не хочу делать еще один поиск но уже по дум, я от него ушел а теперь обратно, как-то не камельфо.
Maksym
Уже все описал и экранирование и все, работает гуд.
Maksym
Пока это конечно самый правильный вариант
Maksym
Он может выбрать от 1 до любого количества
Anonymous
```
Maksym
Но по умолчанию 5
Anonymous
let reObj = {p: "прекрасная строка", flags: "gi"}; let str = "Моя прекрасная строка. И еще одна прекрасная строка."; let re = new RegExp(reObj.p, reObj.flags); for(let r; r = re.exec(str); ) { console.log(r.join(" - "), r.index) }
Maksym
так экранирую return temp.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
Anonymous
раз пользователю, дают возможность регулярку вводить, наверное это опытный пользователь, понимающий их синтаксис
Anonymous
в любом случае try {} catch тестовый добавить не кто не помешает
Anonymous
а экранирование служебных символов думаю тривальное дело, там же еще и в бд это идет
Anonymous
то есть для бд тоже подготавливается как то
Anonymous
Все так, но после очистки от html индекс то поменяется
я думаю надо так сделать. Выбрать по регулярки строки из бд. Дальше дополнительной очистить их от Html тегов, профильтровать еще раз по регуляркам, запомнив все результаты. Далее посимвольно перебирвать каждую строку, сверяя с результатом регулярки, сразу же вставляя нужные тебе теги, и закрывая их перед < смволами
Anonymous
попробую сейчас набросать
Anonymous
код тебе
Maksym
Все логично
Anonymous
Все логично
дай мне, какой нить тестовый результат с бд
Anonymous
и регулярку к ней
Maksym
Но вопрос открыт, как понять куда обратно вставить html
Maksym
Да я сам напишу код :) Мне бы понять как запомнить положение этих html
Maksym
нет
Maksym
Да это и не важно
Maksym
ок щя
Maksym
Даже так https://jsfiddle.net/stomaks/jgexwfma/444/
Deleted
из html’я в ячейке можно построить дерево ‘hello world <span>lorem ipsum <span>123</span></span> test’ -> 0: ‘hello world ’ 1: [ 0: ‘lorem ipsum ‘, 1: [ 0: ‘123’ ] ] 2: ‘ test’ дерево превращается текст который идет с ассоциативным массивом подсказок - какая часть текста к какой части дерева относится сам текст ‘hello world lorem ipsum 123 test’ массив подсказок [ [[0, 11], [0]], [[11, 22], [1, 0]], [[22, 25], [1, 1, 0]], [[25, 29], [2]], ]
Deleted
Массив подсказок делится на - диапазоны по символов по индексу (левая часть) и путь в элемента в HTML дереве (правая часть)
Deleted
Когда регулярка находит искомое в тексте - мы получаем некоторый диапазон индексов который с помощью массива с подсказками маппим на HTML, в результате знакоем на какое место в HTML’е применить выделение
Deleted
@Stomaks
Igor
Найдет, если я тебя правильно понял конечно
Igor
попробуй вставить 0 в кавычка вне тега
Igor
Я вообще на сам тег не ориентировался
Maksym
Друзья как по мне определять искомый текст внутри тега или нет это гиблое дело. Вариант когда мы вырезаем из текста теги, ищем а потом загоняем html обратно кажется мне самым продуктивным.
Danil
Коллеги, кто-нибудь знает чаты где есть freelance заказы на frontend/fullstack? Что-то не могу нагуглить. Нашёл только по битриксу.
Igor
А так ? https://jsbin.com/jaqurafolo/edit?js,console
Igor
))))))
Maksym
))
Maksym
Было бы просто я бы тут не писал :)
Igor
По условиям автору же 0 надо убрать
Igor
Ну или что у него там вместо 0
Igor
сделать метод аргументов искомое
Maksym
Тоесть через создание div, манипуляции с dom на 200000 строках это гиблое дело.
Artem
Друзья, добрый вечер Подскажите пожалуйста, как лучше сделать в простом калькуляторе что б считало + = / *
Artem
загвоздка у меня в том что б уже введенные какие то числа сумировались или вычетались от следующих введеных цифр
Artem
да задачу я себе сам поставил, просто треню простенькие задачи
Artem
цель сделать простенький калькулятор
zhora
@jobs_bot
Artem
понимаю, что для кого то это ерунда такое, но не рождаются же гуру
Maksym
Друзья вот что я придумал function cutHTML ( str ) { let reg = /<\/?[A-Za-z]+[^>]*>/g, html = {}, temp; while ( (temp = reg.exec(str)) !== null ) { html[temp.index] = temp[0]; str = str.replace(temp[0], ""); } return { str: str, html: html }; } https://jsfiddle.net/stomaks/jgexwfma/501/
Maksym
Эта функция вырежет html из текста при этом запомнив теги и их положение. Дальше можно будет выполнить спокойно поиск. Добавить тег выделения к остальным тегам. А в конце вставить обратно html-теги на место. Что думаете ?
Deleted
Друзья вот что я придумал function cutHTML ( str ) { let reg = /<\/?[A-Za-z]+[^>]*>/g, html = {}, temp; while ( (temp = reg.exec(str)) !== null ) { html[temp.index] = temp[0]; str = str.replace(temp[0], ""); } return { str: str, html: html }; } https://jsfiddle.net/stomaks/jgexwfma/501/
Технически все еще есть случаи об которые данный regexp может сломаться Вопрос в том есть ограничения по вариативности HTML’я с которым мы работаем
Deleted
Deleted
👆
Deleted
Какой например ?
атрибуты: onclick=“alert(‘>’)” alt=“>”
Deleted
также что то подобное можно засунуть в style
Deleted
сейчас
Maksym
Просто при работе с дум, это все таки дум, строиться дерево, а тут мы только локально взяли что надо.
Deleted
Да есть такое
потому все еще предлагаю использовать DOMParser, получать дерево HTML’я и создавать массив с подсказками для поиска по тексту (я выше писал) и защитить себя от любых сценариев которые мы заранее не можем предусмотреть
Maksym
подправил, должен вернуться обобьет с текстом и отдельно html
Maksym
Сейчас еще раз перечитаю, что ты написал
Maksym
могу подробнее расписать
А массив подсказок нужен чтобы не получилось так? <i> ... <b> ... </i> ... </b>
Deleted
А массив подсказок нужен чтобы не получилось так? <i> ... <b> ... </i> ... </b>
Массив подсказок нужен чтобы после того как ты в текст без HTML’я нашел искомое, то ты мог выделить это в самом HTML’е
Maksym
А было так <i> ... <b> ... </b> </i> <b> ... </b>
Deleted
то есть он указывает на точки в дереве
Deleted
сейчас, пишу пример
Maksym
Можно jquery пользовать, я его подключил, так к слову
Deleted
var html = 'hello world <span>lorem ipsum <span>123</span></span> test' var parser = new DOMParser() var dom = parser.parseFromString(html, "text/html") var text = '' var hints = [] var transformDom = (element, path = []) => Array .from(element.childNodes) .map((child, i) => { const childPath = [...path, i] if (child instanceof Text) { const hint = [ [text.length, text.length + child.textContent.length], childPath ] text += child.textContent hints.push(hint) } else { transformDom(child, childPath) } }) transformDom(dom.body) console.log(JSON.stringify(hints, null, ‘\t’))
Deleted
Сорри, сейчас загоню пример на сайт
Anonymous
(() => { const inputArrayFromDB = [ {id: 0, text: "Моя прекрасная строка. <span a=\"0\">Супер строка внтури.</span> Супер строка. кек"}, {id: 1, text: " Строка. Еще строки. <b>dd</b>Строка 3<b>dd</b><b>dd</b>. Уникальная стро<span a=\"0\">ка</span> ..."}, ]; const userPattern = {pattern: "строка", flags: "gi"}; class MyFilter { constructor(array, pattern, callback) { Object.assign(this, {array, pattern, callback}); } process(html, rg) { const {callback} = this; const htmlTagsArray = []; const text = html.replace(/\<[^]+?\>/g, (tag, index) => htmlTagsArray.push({tag, index}) && "" ); const matchArray = []; for(let match; match = rg.exec(text); ) { matchArray.push({index: match.index, match: match[0], length: match[0].length}); } if ( !matchArray.length ) { throw new Error("Not found"); } const selectArray = []; let shift = 0; let i = 0; let tag = htmlTagsArray.shift(); for(const match of matchArray) { while(true) { const m_index = match.index + shift; if ( !tag ) { let len = match.length; selectArray.push([m_index, len]); break; } if ( m_index < tag.index ) { let len = (tag.index - m_index); if ( len >= match.length ) { len = match.length; selectArray.push([m_index, len]); break; } else { match.length -= len; match.index += len; selectArray.push([m_index, len]); continue; } } if ( m_index >= tag.index ) { shift += tag.tag.length; tag = htmlTagsArray.shift(); continue; } break; } } let newHtml = ""; let prev = 0; for(const select of selectArray) { newHtml += html.substr(prev, select[0] - prev); prev = select[0] + select[1]; newHtml += callback( html.substr(select[0], select[1]) ); } newHtml += html.substr(prev); return newHtml; } getResult() { const {array, pattern} = this; const newArray = []; for(const item of array) { try { newArray.push({...item, newText: this.process(item.text, new RegExp(pattern.pattern, pattern.flags))}); } catch(e) { console.log(e) } } return newArray; } } const result = new MyFilter(inputArrayFromDB, userPattern, (substr) => { return `<span class="select-substr">${substr}</span>`; }).getResult(); console.log(result); })();