Убрать все теги HTML, кроме ссылок - PullRequest
27 голосов
/ 04 сентября 2008

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

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

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

Ответы [ 6 ]

26 голосов
/ 04 сентября 2008
<(?!\/?a(?=>|\s.*>))\/?.*?>

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

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

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

1 голос
/ 22 сентября 2008

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

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

1 голос
/ 05 сентября 2008

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

0 голосов
/ 14 мая 2014

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
0 голосов
/ 28 декабря 2009

Вот, пожалуйста:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
0 голосов
/ 04 сентября 2008

Как насчет

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...