Как удалить определенные теги внутри div с помощью RegEx

0

У меня есть очень грязный HTML, с несколькими тегами <span> я бы хотел избавиться. Некоторые из них закрыты, другие - нет. Иногда в разметке появляются разрывы рандонов. Как я уже сказал, беспорядочно.

Пример:

<div class="post">
<span style="color: #007700">!</span>
<span style="color: #0000BB">defineLOW1</span>
<span style="color: #007700">$</span><span style="color: #0000BB">0
<br /></span><span style="color: #007700">!</span>
<span style="color: #0000BB">deinfeHIGH1</span><span style="color: #007700">$</span>
<span style="color: #0000BB">1
<br /></span>
<span style="color: #007700">!</span>
<span style="color: #0000BB">defineLOW2</span><span style="color: #007700">$</span><span style="color: #0000BB">2
<br /></span>
<span style="color: #007700">!</span>
<span style="color: #0000BB">deinfeHIGH2</span><span style="color: #007700">$</span><span style="color: #0000BB">3
</div>

То, что я ищу способ лишить все <span> и </span> тегов внутри DIV из класса post, как я хотел бы, чтобы запустить сценарий над кучей статических HTML - страницы.

Теги:

1 ответ

0
Лучший ответ

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

Одна вещь, которая может вызвать множество проблем, состоит в том, что у вас есть вложенные элементы <div>. (Мы не будем беспокоиться о вложенных элементах <span>, потому что мы просто удалим их все.) Это общая проблема с регулярными выражениями. Если вы используете этот матч:

<div class="post">[^]*</div>

Примечание: [^] - пустой класс символов с отрицанием, предназначенный для соответствия всем, включая символы новой строки. Точечный метасимвол, напротив, не соответствует новым символам, поэтому мы его не используем. Это может не работать во всех реализациях регулярных выражений, как указывает Богемиан в комментариях ниже. Я знаю, что он работает в.NET и JavaScript. Если он не работает в вашей реализации, вы можете использовать clunkier (?:.|\n) или [\s\S].

Это будет хорошо работать, пока у вас не будет этого HTML:

<div class="post">
    <span>Some text in a span.</span>
    <div>
      <span>Some more text in a span.</span>
    </div>
    <span>Whoops!  I'll get missed....</span>
</div>

Этот последний <span> не будет включен в ваш матч, потому что он будет соответствовать открывающему div, а затем FIRST закрывающий </div> он наследует... который фактически является частью внутреннего div.

Итак, если у вас это происходит, у вас есть гораздо более сложная проблема, и вам придется реализовать что-то более сложное (например, настоящий синтаксический анализатор HTML, который будет иметь сложности, потому что ваш HTML плохо сформирован),

Двигаясь дальше, предположим, что у вас нет дополнительного <div> вложенного внутри <div class="post">. Ваше первое регулярное выражение будет соответствовать этому полному div:

<div .*\bclass="post".*>(.*)</div>

Это даст вам все нужные вам div. Я не знаю, какой язык или аромат регулярных выражений вы используете, но большинство поддерживают какую-то вложенную замену. То, что вы хотите сделать, это сделать вторую замену в первой согласованной группе (что внутри div). Это будет довольно просто. Просто замените <span\b.*?> Одним пробелом или &nbsp; , Я рекомендую заменить некоторые пробелы, потому что в противном случае вы можете столкнуться с некоторыми проблемами, связанными друг с другом. Это будет зависеть от вас.

Некоторые примечания:

  • Я написал все это как чувствительный к регистру. Если у вас есть <SPAN> или class="Post" или тому подобное, вам придется сделать его случайным.

  • Я не учитывал дополнительные пробелы. Таким образом, это не будет соответствовать <div class= "post">. Это достаточно легко исправить, если это проблема.

  • Я не принимал во внимание использование одинарных кавычек. Таким образом, это не будет соответствовать <div class='post'>. Опять же, это довольно легко исправить.

Если вы используете регулярные выражения в редакторе, это будет немного сложнее, потому что ни один редактор, о котором я знаю, не позволяет выполнять подзамены. Однако на большинстве языков программирования это будет возможно. Если вы дадите мне знать, что вы используете для выполнения своих регулярных выражений, я могу сделать этот ответ более полным.

  • 0
    [^] недопустимо: выдает ошибку «пустой класс символов».
  • 0
    Не правильно, богемный. [^] - пустой класс отрицанных символов. Это включает в себя все. Вы можете подумать, что это так же, как . , но ты ошибаешься . соответствует всему, кроме новых строк. [^] соответствует всему, включая новые строки. Так что это похоже на «супер период».
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню