2008-09-04 4 views
26

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

оригинальные «стрип теги» регулярное выражение я использую был <(.|\n)+?>, и я попытался изменить его <([^a]|\n)+?>, но что, конечно, позволит использовать любой тег, который имеет a, а не тот, который имеет его в начале, с пробелом.

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

ответ

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

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

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

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

+0

Это не работает для меня с `sed` ... – Geremia 2014-05-13 19:37:41

1

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

1

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

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

0

Здесь вы идете:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

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