Я пытаюсь написать регулярное выражение для удаления всего HTML, за исключением ссылок (теги <a href
и </a>
соответственно. Он не должен быть на 100% безопасным (меня не беспокоят атаки с использованием инъекций или что-то еще, поскольку я анализирую контент, который уже одобрен и опубликован в фильме SWF).
Исходным регулярным выражением для «полосовых тегов», которое я использую, было <(.|\n)+?>
, и я попытался изменить его на <([^a]|\n)+?>
, но это, конечно, позволит использовать любой тег, в котором есть а, а не тот, который имеет его в начале, с Космос.
Не то чтобы это действительно имело значение, но если кому-то интересно, я пишу это в ActionScript 3.0 для фильма Вспышка.
Как насчет
<[^a](.|\n)+?>
?
<(?!/?a(?=>|\s.*>))/?.*?>
Попробуй это. Было что-то подобное для тегов p. Работал на них, поэтому не понимаю, почему бы и нет. Использует отрицательный просмотр вперед, чтобы проверить, что он не соответствует (с префиксом необязательного символа /), где (с использованием положительного просмотра вперед) за (с необязательным префиксом /) следует> или пробел, прочее, а затем>. Затем это соответствует до следующего символа>. Поместите это в подстановку с помощью
s/<(?!/?a(?=>|\s.*>))/?.*?>//g;
Это должно оставить только открывающий и закрывающий теги
Я продолжаю говорить об этом, но я не могу рекомендовать регулярное выражение слишком часто. Это фантастика для тестирования такого рода вещей.
В общем, с этим подходом есть проблемы. Регулярные выражения лучше всего подходят для «плоских» текстовых совпадений - вложенные данные подталкивают механизмы регулярных выражений в области, для которых они не предназначены. Для общего анализа HTML нужен синтаксический анализатор, а не механизм регулярных выражений (Google, чтобы узнать разницу между обычными и контекстно-свободными языками, если вам нужны полные технические детали).
Легко удалить все теги, заменив / </ и /> / пустой строкой или их эквивалентами сущностей, но выборочная фильтрация HTML с использованием регулярных выражений будет уязвима для широкого спектра случайных или злонамеренных вводов, нарушающих работу.
Ну вот:
{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
Это сохраняет <a>, но удаляет </a>