Регулярное выражение для удаления пустых тегов <span>

Я бы хотел, чтобы такие пустые теги span (заполненные &nbsp;и пробелы) были удалены:

<span> &nbsp; &nbsp; &nbsp; </span>

Я пытался с этим регулярным выражением, но он нуждается в настройке:

(<span>(&nbsp;|s)*</span>)

preg_replace('#<span>(&nbsp;|s)*</span>#si','<\1>',$encoded);

php,html,regex,

1

Ответов: 7


Перевод регулярного выражения Кента Фредрика на PHP:

preg_match_all('#<span[^>]*(?:/>|>(?:s|&nbsp;)*</span>)#im', $html, $result);

Это будет соответствовать:

  • автозаполнение
  • охватывает многострочные линии и в любом случае
  • охватывает атрибуты
  • пролет с нерушимыми пространствами

Может быть, вы должны включать в себя пролеты только <br />в том числе ...

Как обычно, когда дело доходит до настройки regexp, некоторые инструменты удобны:

http://regex.larsolavtorvik.com/


2

,

qr{<span[^>]*(/>|>s*?</span>)}

Должен получить их суть. (Включая теги, связанные с самим стилем XML, т.е.:)

Но вы действительно не должны использовать regex для обработки HTML.

Ответ относится только к контексту вопроса, который был виден до исправления ошибок форматирования


1

Я полагаю, что этот диапазон генерируется некоторой программой, так как у них нет никакого атрибута.
Я недоумеваю, почему вам нужно разместить пространство, которое они заключают между угловыми скобками, но опять же я не знаю конечной цели кода.
Я думаю, что решение дается Kent: вы должны сделать матч не жадным: поскольку вы используете опцию (ы) dotall, вы будете сопоставлять все между первым пролетом и последним закрытием!

Поэтому ответ должен выглядеть так:

preg_replace('#<span>(&nbsp;|s)*?</span>#si', '<$1>', $encoded);

(Непроверенные)


1

Я пытался с этим регулярным выражением, но он нуждается в настройке:

Каким образом нерегинация в исходном вопросе терпит неудачу?

Проблема возникает, когда диапазон становится вложенным: <span><span> &nbsp; </span></span>

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


0

Если ваша единственная проблема - вложенные теги span, вы можете запустить поиск и замену с помощью регулярного выражения, которое вы имеете в цикле, пока регулярное выражение больше не найдет совпадений.

Это может быть не очень элегантное решение, но оно будет работать достаточно хорошо.

PHP, HTML, регулярное выражение,
Похожие вопросы