Убрать все теги 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 с использованием регулярных выражений будет уязвима для широкого спектра случайных или злонамеренных входных данных, которые могут испортить ситуацию.
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