Регулярное выражение для удаления пустых тегов <span> - PullRequest
1 голос
/ 15 ноября 2008

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

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

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

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

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

Ответы [ 7 ]

5 голосов
/ 15 ноября 2008

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

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

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

  • автозамкнутый пролет
  • распространяется на мультилинии и в любом случае
  • охватывает с атрибутами
  • пролет с неразрывными пробелами

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

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

http://regex.larsolavtorvik.com/

2 голосов
/ 15 ноября 2008

.

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

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

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

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

1 голос
/ 15 ноября 2008

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

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

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

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

1 голос
/ 15 ноября 2008

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

Так что ответ должен выглядеть так:

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

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

0 голосов
/ 22 апреля 2011

Немного изменив ответ e-sat:

function remove_empty_spans($html_replace)
{
$pattern = '/<span[^>]*(?:\/>|>(?:\s|&nbsp;)*<\/span>)/im';
return preg_replace($pattern, '', $html_replace);
}

Это сработало для меня.

0 голосов
/ 19 ноября 2008

Вот мое решение проблем с вложенными тегами, но оно еще не завершено, но близко ...

$test="<span>   <span>& nbsp;  </span>  test <span>& nbsp; <span>& nbsp;  </span>  </span> & nbsp;& nbsp; </span>";

$pattern = '#<(\w+)[^>]*>(& nbsp;|\s)*</\1>#im';      
while(preg_match($pattern, $test, $matches, PREG_OFFSET_CAPTURE)!= 0)
{$test= preg_replace($pattern,'', $test);}

Для коротких $ тестовых предложений функция работает нормально. Проблема возникает при попытке с длинным текстом. Любая помощь будет оценена ...

0 голосов
/ 16 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...