Удалите все теги HTML, кроме ссылок
Я пытаюсь написать регулярное выражение, чтобы удалить все HTML, за исключением ссылок (теги <a href
и </a>
соответственно). Он не должен быть на 100% безопасным (меня не беспокоят атаки на инъекции или что-либо, поскольку я разбираю контент, который уже был одобрен и опубликован в SWF).
Исходное выражение "strip tags", которое я использую, было <(.|\n)+?>
, и я попытался изменить его на <([^a]|\n)+?>
, но это, конечно, позволит использовать любой тег, имеющий a в нем, а не в том, что имеет его в начале, с пространством.
Не то, чтобы это действительно имело значение, но в случае, если кто-то хочет знать, что я пишу это в ActionScript 3.0 для Flash.
Ответы
Ответ 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