alexeyvolodin
@alexeyvolodin
истина где-то рядом

Как с помощью regexp удалить теги, у которых есть атрибут class и style, вместе с контентом?

Доброго времени суток.
Есть кусок html кода
<span>Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati iste ullam suscipit voluptatibus, adipisci quis inventore ipsum quasi totam voluptas eaque, nihil sunt dicta maiores nostrum quaerat corporis ducimus optio.</span>
<span class="asdaad" style="display: block"><small>Some text</small></span>
<span>Iste, officia rerum maiores laborum at iure iusto quia excepturi assumenda tenetur saepe ratione, eveniet veniam, quos quaerat cumque. Laudantium, praesentium? Quas porro perspiciatis officiis labore tempora quaerat enim totam!</span>
<span class="uadnvi" style="display: block"><small>Some text</small></span>
<span>Dolorem voluptas voluptatem excepturi sunt sequi dolorum error iusto aliquid voluptate magni alias ut quasi facere doloribus id saepe necessitatibus officiis esse, eligendi quod soluta ipsa culpa! Adipisci, veritatis, aliquam?</span>
<span class="sdtrad" style="display: block"><small>Some text</small></span>
<span>Quibusdam facere sed porro officia, dolor non nisi nesciunt, rem sit ipsa amet natus reiciendis beatae aut ab magnam rerum repudiandae et repellendus dolore? Nisi, doloremque neque perferendis magnam nemo.</span>
<span class="osdurb" style="display: block"><small>Some text</small></span>
<span>Exercitationem, reprehenderit. Ipsa pariatur magnam id, ad est, numquam exercitationem sint repellat tempora reiciendis culpa dolore aliquam aspernatur laborum officia quos? Sequi, minus minima unde voluptate modi error maiores tenetur.</span>

Если это важно - код приходит одной строкой. Значение классов у span генерируется всегда новое.
Как при помощи регулярок можно удалить span у которых есть class и style вместе с содержимым, не затронув при этом span без аттрибюутов, не содержащие паразитных строк.
  • Вопрос задан
  • 282 просмотра
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Плохая идея регекспами такое парсить. Лучше воспользйтесь lxml или любым таким парсером.
Проблема в том, что у вас внтури такого тега может (теоретически) быть непредсказуемая вложенность других тегов. Рекурсивные и контекстные вещи регекспами делаются очень неудобно.
Разбейте весь текст запроса на лексемы, например так:
re.split('<|>')
И вы получите сисок, где нулевой и все четные элементы - это фрагменты текста, а все нечетные по индексу элементы - это содержимое тегов. Содержимое закрывающих тегов можно распозать по слешу.
Дальше нужно запрограммировать конечный автомат с двумя состояниями, которому можно скормить этот список, а вернёт он такой же список, но отфильтрует ненужные элементы.
Грубо говоря, в первом состоянии вы перебираете входной список и когда встречаете нечетный эелемент (тег), начинающийся со слова span и содержащий атрибуты, сбрасываете счетчик в ноль и переходите во творое состояние.
Во втором - перебираете се элементы и инкрементируете счетчик каждый раз когда попадается открывающий тег, и декрементируете когда попадается закрывающий (нечетный элемент, начинающийся начинается со слеша). Если счетчик снова стал нулём, переходите в первое состояние.
На выход следует пропускать только элементы находясь в первом состоянии. Второе состояние подавляет выхлоп.
def f(lexems): 
    state, deep = 0, 0 
    for i, lex in enumerate(lexems): 
        if state == 0: 
            if i%2 and lex.startswith('span '): 
                state = 1 
                deep = 1 
            else: 
                yield f'<{lex}>' if i%2 else lex 
        else: 
            if i%2: 
                deep += -1 if lex.startswith('/') else 1 
            if deep == 0: 
                state = 0
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@golentor
Почти регулярка) Но это заработает также
(function(){
$('span').each(function(){
if($(this).attr('class') && $(this).attr('style') $(this).remove() 
})
})(jQuery)


Неблагодарите.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы