Удалите все HTML-теги, кроме ссылок
-
09-06-2019 - |
Вопрос
Я пытаюсь написать регулярное выражение, чтобы удалить весь HTML-код, за исключением ссылок (the <a href
и </a>
теги соответственно.Это не обязательно должно быть на 100% безопасно (я не беспокоюсь о инъекционных атаках или о чем-то еще, поскольку я анализирую контент, который уже был одобрен и опубликован в SWF фильм).
Оригинальное регулярное выражение "strip tags", которое я использую, было <(.|\n)+?>
, и я попытался изменить его на <([^a]|\n)+?>
, но это , конечно, позволит любому тегу , который имеет a в нем, а не в том, у которого оно есть в начале, с пробелом.
Не то чтобы это действительно имело значение, но на случай, если кому-то интересно знать, я пишу это в ActionScript 3.0 для Вспышка Фильм.
Решение
<(?!\/?a(?=>|\s.*>))\/?.*?>
Попробуй это.Было что-то подобное для p-тегов.Работал на них, так что не понимаю, почему бы и нет.Использует отрицательный предварительный просмотр, чтобы проверить, что он не соответствует a (с префиксом необязательного символа /), где (используя положительный предварительный просмотр) за a (с необязательным префиксом /) следует a > или пробел, stuff и затем >.Затем это значение совпадает до следующего символа >.Поместите это в subst с помощью
s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;
При этом должны остаться только открывающие и закрывающие теги
Другие советы
Я продолжаю говорить об этом, но я никак не могу рекомендовать регулярное выражение слишком часто.Это просто фантастика для тестирования подобных вещей.
В целом, с таким подходом связаны проблемы.Регулярные выражения лучше всего подходят для "плоских" текстовых соответствий - вложенные данные выталкивают механизмы регулярных выражений в области, для которых они не предназначены.Для общего синтаксического анализа HTML нужен анализатор, а не движок регулярных выражений (погуглите разницу между обычным и контекстно-свободными языками, если вам нужны полные технические подробности).
Легко удалить все метки, заменив их /</ и />/ с пустой строкой или их эквивалентами сущностей, но выборочная фильтрация HTML с использованием регулярных выражений будет уязвима для широкого спектра случайных или вредоносных входных данных, нарушающих работу.
Держи, пожалуйста:
{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
Как насчет
<[^a](.|\n)+?>
?
strip_tags()
делает это.
Здесь я включаю в себя все <a><p><font><b><i><sup>
теги и вывод исправленной версии:
cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm