рони,
ахах, хорошо, не буду больше присылать картинки, раз Вам это не нравится) Думал так понятнее для отображения ожидаемого результата) Пример: исходная строка главный врач 12345 главный сан врач искомые совпадения гл вр главный врач 12345 главный сан врач Вот пример с картинки) Такое не сработает на данный момент если добавить слово между "главный" и "врач" |
Adrikks,
картинка это замечательно пусть будет, но для проверки необходим текст. |
рони,
Понял) В общем суть в том, что должны выделяться последовательности искомых подстрок вне зависимости от кол-ва символов между ними Был бы очень благодарен, если бы подсказали как это можно сделать |
Adrikks,
нужен алгоритм. :) пока не знаю короткой дороги. |
поиск совпадений в последовательности слов
Adrikks,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
label {
display: flex;
flex-direction: column;
}
#result mark {
color: #FF0000;
}
</style>
</head>
<body>
<label>
Исходная строка:
<input id="text" placeholder="Введите текст..." value="главный врач 12345 главный сан врач">
</label>
<label>
Искомые совпадения:
<input id="search" placeholder="Введите текст..." value="гл вр">
</label>
<p id="result"></p>
<script>
RegExp.escape = s => s.replace(/[[\\^$.|?*+()]/gim, "\\$&");
function mark(string) {
const node = document.createElement("mark");
node.textContent = string;
return node;
}
search.addEventListener("input", () => {
const value = text.value.match(/\s+|\S+/g);
let parts = search.value.trim();
const length = parts.length;
if(!value || !length) {result.textContent = text.value; return};
parts = parts.split(/\s+/).map(pattern => new RegExp("(\\S*?)(" +RegExp.escape(pattern) +")(\\S*)", "i"));
result.textContent = "";
let temp = [];
for (let i = 0; i < value.length; ) {
let k = i, arrFindIndex = [];
let found = parts.every(reg => {
let index = value.slice(k).findIndex(el => reg.test(el));
if(index === -1 ) return false;
k += index;
arrFindIndex.push({k,reg});
k++;
return true
});
if(found) {i = k; temp.push(...arrFindIndex)}
else i++;
}
value.forEach((el, i) => {
const find = temp.find(({k}) => k == i);
if(find){
const {reg} = find;
[_, ...el]= el.match(reg);
el[1] = mark(el[1])
result.append(
...el
)
}
else result.append(el)
})
});
search.dispatchEvent(new Event("input"));
</script>
</body>
</html>
|
рони,
последовательность из двух символов находится везде, а из одного допустим, только один раз Пример как должно: Исходный текст: АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА Искомые совпадения: а б Результат: АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА |
Цитата:
|
рони,
Я понимаю) Я не знаю как вам объяснить всё это в одном алгоритме По этому и кидал картинку |
Adrikks,
Цитата:
должно быть так <p id="result"><mark>А</mark>ЛИЕВА <mark>Б</mark><mark>А</mark>ЙНАТ А<mark>Б</mark>ДУРАХМАНОВНА</p> |
рони,
Я вам показал, как по заданному мне заданию) Ну хотя бы с вариантом представленным у вас, помогите пожалуйста) Больше не побеспокою Вас |
| Часовой пояс GMT +3, время: 08:58. |