Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Как насчет

<[^a](.|\n)+?>

?

Ответ 6

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