Я бы хотел, чтобы такие пустые теги span (заполненные и пробелом) были удалены:
<span> </span>
Я пробовал использовать это регулярное выражение, но его нужно отрегулировать:
(<span>( |\s)*</span>)
preg_replace('#<span>( |\s)*</span>#si','<\\1>',$encoded);
Ваше регулярное выражение в порядке. Просто измените строку замены с '<\\1>' на ''.






.
qr{<span[^>]*(/>|>\s*?</span>)}
Должен понять их суть. (Включая самозакрывающиеся теги в стиле XML, например:)
Но вы В самом деле не должны использовать регулярное выражение для обработки HTML.
Ответ актуален только для контекста вопроса, который был виден до исправления ошибок форматирования.
Да, я не мог быть напичкан неприятными стилями цитирования, необходимыми: / user упражнение, чтобы сделать регулярное выражение подходящим для их языка: p
Я действительно устаю от людей, говорящих, что вы не должны использовать регулярные выражения ни в каком виде XML или HTML. Иногда используют что-то вроде Beautiful Soup действительно не подходит.
В этом случае это будет нормально, если только это не происходит внутри цитируемых областей. Это делает его очень хрупким, и я бы не стал его использовать, кроме как в крайнем случае.
@nickf: это для борьбы с проблемой миллионов новичков, которые используют его в качестве первого порта захода, а затем самостоятельно используют XSS.
Я полагаю, что эти промежутки генерируются какой-то программой, поскольку, похоже, у них нет никаких атрибутов. Я не понимаю, почему вам нужно поместить пространство, которое они заключают между угловыми скобками, но опять же, я не знаю конечного назначения кода. Я думаю, что решение дано Кентом: вы должны сделать совпадение не жадным: поскольку вы используете опцию (-ы) dotall, вы сопоставите все между первым и последним закрывающим диапазоном!
Итак, ответ должен выглядеть так:
preg_replace('#<span>( |\s)*?</span>#si', '<$1>', $encoded);
(непроверено)
Перевод регулярного выражения Кента Фредрика на PHP:
preg_match_all('#<span[^>]*(?:/>|>(?:\s| )*</span>)#im', $html, $result);
Это будет соответствовать:
Возможно, вам стоит также включить пролеты, содержащие только <br /> ...
Как обычно, когда дело доходит до настройки регулярного выражения, пригодятся некоторые инструменты:
http://regex.larsolavtorvik.com/
OP хочет пустые элементы SPAN удаленный.
I've tried with this regex, but it needs adjusting:
Каким образом регулярное выражение в исходном вопросе терпит неудачу?
The problem comes when the span gets nested like:
<span><span> </span></span>
Это пример того, почему использование регулярных выражений для синтаксического анализа HTML не работает особенно хорошо. В зависимости от вашего вкуса регулярного выражения эту ситуацию либо невозможно обработать за один проход, либо просто очень сложно. Я не знаю движка регулярных выражений PHP достаточно хорошо, чтобы сказать, в какую категорию он попадает, но если единственная проблема заключается в том, что он удаляет внутренний <span> и оставляет внешний в покое, тогда вы можете просто повторно запустить свой замену неоднократно, пока не закончатся дела.
Да, я согласен, но я хотел знать, есть ли способ повторно запустить его рекурсивно? В противном случае будет сложно предсказать номера / имена вложенных тегов ...
Если ваша единственная проблема - вложенные теги диапазона, вы можете запускать поиск и замену с регулярным выражением, которое у вас есть в цикле, пока регулярное выражение не перестанет находить совпадения.
Возможно, это не очень элегантное решение, но оно будет работать достаточно хорошо.
Вот мое решение проблем с вложением тегов, еще не полное, но близкое ...
$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| )*</span>)/im';
return preg_replace($pattern, '', $html_replace);
}
Это сработало для меня.
Вам нужно будет сначала декодировать URL-адрес содержимого ваших тегов span, прежде чем ваше регулярное выражение будет работать с образцом, который вы указали выше.