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

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

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

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

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

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

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

OJ. 15.11.2008 16:18

Ваше регулярное выражение в порядке. Просто измените строку замены с '<\\1>' на ''.

ridgerunner 18.08.2011 18:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
11 591
7

Ответы 7

.

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

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

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

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

Да, я не мог быть напичкан неприятными стилями цитирования, необходимыми: / user упражнение, чтобы сделать регулярное выражение подходящим для их языка: p

Kent Fredric 15.11.2008 16:18

Я действительно устаю от людей, говорящих, что вы не должны использовать регулярные выражения ни в каком виде XML или HTML. Иногда используют что-то вроде Beautiful Soup действительно не подходит.

nickf 15.11.2008 16:51

В этом случае это будет нормально, если только это не происходит внутри цитируемых областей. Это делает его очень хрупким, и я бы не стал его использовать, кроме как в крайнем случае.

Brad Gilbert 15.11.2008 21:01

@nickf: это для борьбы с проблемой миллионов новичков, которые используют его в качестве первого порта захода, а затем самостоятельно используют XSS.

Kent Fredric 16.11.2008 02:04

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

Итак, ответ должен выглядеть так:

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

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

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

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

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

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

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

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

http://regex.larsolavtorvik.com/

OP хочет пустые элементы SPAN удаленный.

ridgerunner 18.08.2011 18:02

I've tried with this regex, but it needs adjusting:

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

The problem comes when the span gets nested like: <span><span> &nbsp; </span></span>

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

Да, я согласен, но я хотел знать, есть ли способ повторно запустить его рекурсивно? В противном случае будет сложно предсказать номера / имена вложенных тегов ...

Kevin Dente 15.11.2008 23:32

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

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

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

$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);}

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

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

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

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

Другие вопросы по теме