Убрать все теги HTML, кроме ссылок

Я пытаюсь написать регулярное выражение для удаления всего HTML, за исключением ссылок (<a href а также </a> теги соответственно. Это не обязательно должно быть на 100% безопасно (я не беспокоюсь о инъекционных атаках или чем-либо еще, поскольку я анализирую контент, который уже был одобрен и опубликован в фильме SWF).

Исходное регулярное выражение "tag tags", которое я использую, было <(.|\n)+?>и я попытался изменить его <([^a]|\n)+?>, но это, конечно, позволит любому тегу, в котором есть a, а не в начале, с пробелом.

Не то чтобы это действительно имело значение, но на случай, если кто-нибудь захочет узнать, я пишу это в ActionScript 3.0 для Flash- фильма.

7 ответов

Решение
<(?!\/?a(?=>|\s.*>))\/?.*?>

Попробуй это. Было что-то похожее на теги p. Работал на них, поэтому не понимаю, почему нет. Использует отрицательный просмотр, чтобы убедиться, что он не соответствует (с префиксом необязательный / символ), где (с использованием положительного просмотра) за (с необязательным / префиксом) следует> или пробел, вещи и затем>. Это соответствует до следующего> символа. Поместите это в субтитр с

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;

Это должно оставить только открытие и закрытие тегов

Я продолжаю в том же духе, но я не могу рекомендовать регулярные выражения слишком часто. Это фантастика для тестирования такого рода вещей.

Вообще есть проблемы с этим подходом. Регулярные выражения лучше всего подходят для "плоских" текстовых совпадений - вложенные данные помещают механизмы регулярных выражений в области, для которых они не предназначены. Общий анализ HTML требует анализатора, а не механизма регулярных выражений (Google для разницы между обычными и контекстно-свободными языками, если вы хотите получить полную техническую информацию).

Все теги легко удалить, заменив // пустой строкой или их эквивалентами сущностей, но выборочная фильтрация HTML с использованием регулярных выражений будет уязвима для широкого спектра случайных или злонамеренных входных данных, которые могут испортить ситуацию.

Ну вот:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
      "<[^> |(\\s.*herf=)]*[^a]>"

Как насчет

<[^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
Другие вопросы по тегам