Регулярное выражение для удаления тегов HTML - PullRequest
9 голосов
/ 25 сентября 2010

Я использую следующее регулярное выражение для удаления тегов HTML из строки.Это работает, за исключением того, что я оставляю закрывающий тег.Если я попытаюсь удалить: <a href="blah">blah</a>, то выйдет из <a/>.

. Я вообще не знаю синтаксиса регулярных выражений и проверил это.Может кто-то со знанием RegEx, пожалуйста, предоставьте мне шаблон, который будет работать.

Вот мой код:

  string sPattern = @"<\/?!?(img|a)[^>]*>";
  Regex rgx = new Regex(sPattern);
  Match m = rgx.Match(sSummary);
  string sResult = "";
  if (m.Success)
   sResult = rgx.Replace(sSummary, "", 1);

Я надеюсь удалить первый случай <a> и <img> тегов.

Ответы [ 13 ]

19 голосов
/ 25 сентября 2010

Использование регулярного выражения для разбора HTML чревато подводными камнями. HTML не является обычным языком и, следовательно, не может быть на 100% правильно проанализирован с помощью регулярного выражения. Это только одна из многих проблем, с которыми вы столкнетесь. Лучший способ - использовать парсер HTML / XML, чтобы сделать это за вас.

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

Как говорится, вот решение, которое должно решить эту конкретную проблему. Это ни в коем случае не идеальное решение, хотя.

var pattern = @"<(img|a)[^>]*>(?<content>[^<]*)<";
var regex = new Regex(pattern);
var m = regex.Match(sSummary);
if ( m.Success ) { 
  sResult = m.Groups["content"].Value;
15 голосов
/ 22 июня 2014

Чтобы включить это:

'<td>mamma</td><td><strong>papa</strong></td>'

в это:

'mamma papa'

Вам необходимо заменить теги пробелами:

.replace(/<[^>]*>/g, ' ')

и уменьшите дублирующиеся пробелы в одиночные пробелы:

.replace(/\s{2,}/g, ' ')

затем обрежьте начальные и конечные пробелы с помощью:

.trim();

То есть функция удаления тега выглядит следующим образом:

function removeTags(string){
  return string.replace(/<[^>]*>/g, ' ')
               .replace(/\s{2,}/g, ' ')
               .trim();
}
3 голосов
/ 09 декабря 2014

Чтобы также удалить пробелы между тегами, вы можете использовать следующий метод: сочетание между регулярным выражением и усечением для пробелов в начале и конце входного html:

    public static string StripHtml(string inputHTML)
    {
        const string HTML_MARKUP_REGEX_PATTERN = @"<[^>]+>\s+(?=<)|<[^>]+>";
        inputHTML = WebUtility.HtmlDecode(inputHTML).Trim();

        string noHTML = Regex.Replace(inputHTML, HTML_MARKUP_REGEX_PATTERN, string.Empty);

        return noHTML;
    }

Так что для следующего ввода:

      <p>     <strong>  <em><span style="text-decoration:underline;background-color:#cc6600;"></span><span style="text-decoration:underline;background-color:#cc6600;color:#663333;"><del>   test text  </del></span></em></strong></p><p><strong><span style="background-color:#999900;"> test 1 </span></strong></p><p><strong><em><span style="background-color:#333366;"> test 2 </span></em></strong></p><p><strong><em><span style="text-decoration:underline;background-color:#006600;"> test 3 </span></em></strong></p>      

Выводом будет только текст без пробелов между тегами html или пробел до или после html: "Текст теста тест 1 тест 2 тест 3".

Обратите внимание, что пробелы перед test text взяты из <del> test text </del> html, а пробелы после test 3 взяты из <em><span style="text-decoration:underline;background-color:#006600;"> test 3 </span></em></strong></p> html.

2 голосов
/ 25 сентября 2010

Итак, HTML-парсер, о котором все говорят, это Html Agility Pack .

Если это чистый XHTML, вы также можете использовать System.Xml.Linq.XDocument или System.Xml.XmlDocument.

1 голос
/ 10 декабря 2018

Если вам нужно найти только открывающие теги, вы можете использовать следующее регулярное выражение, которое будет записывать тип тега как $ 1 (a или img), а содержимое (включая закрывающий тег, если таковой имеется) как $ 2:

(?:<(a|img)(?:\s[^>]*)?>)((?:(?!<\1)[\s\S])*)

Если у вас также есть закрывающий тег, вы должны использовать следующее регулярное выражение, которое будет записывать тип тега как $ 1 (a или img), а содержимое как $ 2:

(?:<(a|img)(?:\s[^>]*)?>)\s*((?:(?!<\1)[\s\S])*)\s*(?:<\/\1>)

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

Краткое объяснение запроса:

  • ( ) - используется для захвата всего, что соответствует регулярному выражению в скобках.Порядок захвата следующий: $ 1, $ 2 и т. Д.
  • ?: - используется после открывающей скобки "(", чтобы не захватывать содержимое внутри скобок.
  • \1 - копирует захват номер 1. Это тип тега. Мне нужно было захватить тип тега, чтобы закрывающий тег соответствовал открывающему, а не что-то вроде: <img src=""> </a>.
  • \s- это пробел, поэтому после открытия тега <img будет как минимум 1 пробел в случае наличия атрибутов (например, он не будет соответствовать <imgs>).
  • [^>]* - isищет что-либо, кроме символов внутри, что в данном случае равно >, а * означает неограниченное количество раз.
  • ?! - ищет что-либо, кроме строки внутри, что-то вроде [^>] только для строки вместо одиночных символов.
  • [\ s \ S] - используется почти как ., но допускает любые пробелы (которые также будут совпадать в случае появления новых строк между тегами).вы используете регулярное выражение "s", тогда вы можете использовать . вместо.

Пример использования с закрывающим тегом: https://regex101.com/r/MGmzrh/1

Пример использования без закрывающего тега: https://regex101.com/r/MGmzrh/2

Regex101 также имеет некоторые объяснения того, что я сделал:)

1 голос
/ 04 июля 2018

Удаление HTML-элементов (с / без атрибутов)

/<\/?[\w\s]*>|<.+[\W]>/g

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

Справочник и пример (Ис.10)

1 голос
/ 30 декабря 2016

можно использовать:

Regex.Replace(source, "<[^>]*>", string.Empty);
1 голос
/ 25 сентября 2010

Вы можете использовать уже существующие библиотеки, чтобы убрать HTML-теги. Один хороший пример: Chilkat C # Library .

0 голосов
/ 14 сентября 2018

Простой способ,

String html = "<a>Rakes</a> <p>paroladasdsadsa</p> My Name Rakes";

html = html.replaceAll("(<[\\w]+>)(.+?)(</[\\w]+>)", "$2");

System.out.println(html);
0 голосов
/ 16 августа 2017

Почему бы не попробовать неохотный квантификатор? htmlString.replaceAll("<\\S*?>", "")

(это Java, но главное показать идею)

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