Показать сообщение отдельно
  #18 (permalink)  
Старый 14.12.2019, 00:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Malleys,
может есть иной способ, пока так
<!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="А вы знали, что элемент <mark> используется для подсветки найденного текста?">
    </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.trim().split(/\s+/);
    const parts = search.value.trim().split(/\s+/).map(s => s.toLowerCase());
    const length = parts.length;
    result.textContent = "";
    for (let i = 0; i < value.length; i++) {
        let found = value.slice(i, i + length).every((txt, k) => txt.toLowerCase().includes(parts[k]));
        if(found) {
            parts.forEach((pattern, k) => value[k + i].replace(new RegExp("(\\S*?)(" +RegExp.escape(pattern) +")(\\S*)", "i"), (a,b,c,d) => result.append(
            b,
            mark(c),
            d,
            " "
        )));
            i += length - 1;
        }
        else result.append(value[i], " ")
    }


});
search.dispatchEvent(new Event("input"));
</script>
</body>
</html>

Сообщение от Malleys
Да, вы можете использовать рег. выр. из своего примера.
не знаю как

Последний раз редактировалось рони, 14.12.2019 в 00:34.
Ответить с цитированием