Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Удаление повторяющихся тегов (https://javascript.ru/forum/dom-window/81284-udalenie-povtoryayushhikhsya-tegov.html)

finlolo 03.11.2020 16:14

Удаление повторяющихся тегов
 
Привет.

у меня постятся записи. В них есть лишняя последовательность <div><br><br></div>. То есть получаются лишние переносы в начале и в конце. Либо много в середине.

как удалить их, учитывая, что в начале и в конце строки их нужно удалить все, а в середине, если имеются, только 1.

Пример:

<div><br><br></div>
<div><br><br></div>
<div> Привет, сегодня воскресенье <br> Как ваши дела?</div>
<div><br><br></div>
<div><br><br></div>

Nexus 03.11.2020 16:15

Почему не сделать это вручную один раз?

finlolo 03.11.2020 16:16

В смысле

Nexus 03.11.2020 16:19

Цитата:

Сообщение от finlolo
В смысле

В прямом.
Это же не какая-то последовательность букв и цифр появляющаяся волшебным образом, а либо шаблон, который используется для построения страницы, либо контент страницы, который хранится в файле/бд, либо какой-то файлик, хранящийся на сервере.

Исправьте текст вручную и не придется лепить костыли, чтобы избавиться от мусора в верстке.

finlolo 03.11.2020 16:23

-Nexus,
-

Nexus 03.11.2020 17:42

Работает только в вашем примере. Если br вынести на отдельную строку, работать перестанет, т.к. br каким-то образом превратиться в text node.

<div><br><br></div>
<div><br><br></div>
<div> Привет, сегодня воскресенье <br><br> Как ваши дела?</div>
<div><br><br></div>
<div><br><br></div>

<style>div {background: gray}</style>

<script>
    document.querySelectorAll('* > br').forEach(br => {
        const container = br.parentNode;
        const children = container ? [].slice.call(container.childNodes) : [];
        if (!children.length) {
            return;
        }

        const isBreak = el => (typeof el === 'object') && (el instanceof HTMLBRElement);

        let prevElement = null;
        children.forEach((child, index) => {
            if (!isBreak(child)) {
                const isString = child.nodeType === Node.TEXT_NODE;
                const isElement = !isString && child.nodeType === Node.ELEMENT_NODE;
                if (isElement || isString && child.textContent.length) {
                    prevElement = child;
                }

                return;
            }

            if (prevElement) {
                prevElement = null;

                return;
            }

            if (!prevElement || isBreak(prevElement)) {
                container.removeChild(child);
            }
        });

        if (prevElement && isBreak(prevElement)) {
            container.removeChild(child);
        }
    });
</script>


Часовой пояс GMT +3, время: 16:20.