Регулярное выражение для удаления заданного (x) тега HTML из строки - PullRequest
6 голосов
/ 22 сентября 2008

Допустим, у меня есть строка, содержащая беспорядок текста и (x) теги HTML. Я хочу удалить все экземпляры данного тега (и любые атрибуты этого тега), оставив все остальные теги и текст вместе. Какой лучший Regex, чтобы сделать это?

Отредактировано, чтобы добавить: О, я ценю, что использование Regex для этой конкретной проблемы не является лучшим решением. Однако, ради обсуждения, можем ли мы предположить, что это конкретное техническое решение было принято на несколько уровней выше моего уровня оплаты? ;)

Ответы [ 8 ]

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

Попытка анализа HTML с помощью регулярных выражений - это, как правило, крайне плохая идея. Вместо этого используйте синтаксический анализатор, он должен быть доступен для выбранного вами языка.

Вы могли бы быть в состоянии сойти с рук что-то вроде этого:

</?tag[^>]*?>

Но это зависит от того, что именно вы делаете. Например, это не удалит содержимое тега и может оставить ваш HTML в недопустимом состоянии, в зависимости от того, какой тег вы пытаетесь удалить. Он также плохо справляется с некорректным HTML (и об этом много).

Вместо этого используйте парсер:)

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

Я думаю, что здесь происходит серьезный фанатизм против регулярных выражений. Во многих случаях вам может понадобиться убрать определенный тег из разметки, когда нет смысла использовать полноценный парсер.

Конечно, бывают случаи, когда парсер может быть лучшим вариантом, но если вы ищете регулярное выражение, то:

<script[^>]*?>[\s\S]*?<\/script>

Это удалит теги скрипта и их содержимое. Убедитесь, что вы используете регистронезависимое сопоставление.

Если вы не хотите удалять содержимое тега, вы можете использовать:

<\/?script[^>]*?>

Пример использования в javascript:

function stripScripts(markup) {
  return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');
}

var safeText = stripScripts(textarea.value);
0 голосов
/ 18 мая 2009

Несмотря на то, что использование регулярных выражений для синтаксического анализа HTML, как правило, вызывает недовольство или презрение, вы почти наверняка не захотите писать свой собственный анализатор.

Однако вы можете использовать некоторые встроенные или библиотечные функции для достижения того, что вам нужно.

  • JavaScript имеет getElementsByTagName и getElementById, не говоря уже о jQuery .
  • PHP имеет расширение DOM .
  • У Питона потрясающий Красивый суп
  • ... и многие другие.
0 голосов
/ 25 ноября 2008

Вот регулярное выражение, которое я написал для этой цели, оно работает еще в нескольких ситуациях:

</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>
0 голосов
/ 04 ноября 2008

Исправленный ответ:

</?TAG\b[^>]*?>

Поскольку ответ Dans удалит <br />, но вы хотите только <b>

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

Вне моей головы, я бы сказал, что это поможет вам начать в правильном направлении.

s/<TAG[^>]*>([^<]*)</TAG[^>]*>/\1

В основном найдите начальный тег, любой текст между тегами, а затем конечный тег. Замените все это на то, что было между тегами.

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

Существует только СЛИШКОМ много способов появления одного тега, не говоря уже о кодировках, вариантах и ​​т. Д.
Я настоятельно рекомендую вам переосмыслить этот подход ... в любом случае вам действительно не нужно обрабатывать HTML напрямую.

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

Я думаю, что это может быть Рэймонд Чен (blogs.msdn.com/oldnewthing), который я перефразирую (плохо!) Здесь ... Но вы хотите регулярное выражение? «Теперь у вас две проблемы» ...: =)

Если строка представляет собой правильно сформированный (X) HTML, не могли бы вы загрузить ее в анализатор (HTML / XML) и использовать ее для удаления каких-либо узлов нарушающего разнообразия? Если он не правильно сформирован, он становится немного сложнее, но я подозреваю, что RegEx - не лучший способ сделать это ...

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