Регулярное выражение для удаления тегов HTML

Я использую следующее регулярное выражение для удаления тегов 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>.

Ответ 1

Использование регулярного выражения для синтаксического анализа 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;

Ответ 2

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

'<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

Чтобы удалить также пробелы между тегами, вы можете использовать следующий метод: комбинация между регулярным выражением и обрезкой для пробелов в начале и конце ввода 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.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Regex.Replace(source, "<[^>]*>", string.Empty);

Ответ 7

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

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

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

Ссылка и пример (Пример 10)

Ответ 8

Если вам нужно найти только открывающие теги, вы можете использовать следующее регулярное выражение, в котором тип тега будет записан как $ 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>).
  • [^>]* - ищет что-либо, кроме символов внутри, что в данном случае означает >, а * означает неограниченное количество раз.
  • ?! - ищет что-нибудь, кроме строки внутри, вроде как [^>] только для строки вместо одиночных символов.
  • [\ s\S] - используется почти как . но разрешите любые пробелы (которые также будут совпадать в случае появления новых строк между тегами). Если вы используете регулярное выражение "s", то вы можете использовать . вместо.

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

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


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

Ответ 9

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

public static class StringExtensions
{
     public static string StripHTML(this string htmlString, string htmlPlaceHolder) {
         const string pattern = @"<.*?>";
         string sOut = Regex.Replace(htmlString, pattern, htmlPlaceHolder, RegexOptions.Singleline);
         sOut = sOut.Replace("&nbsp;", String.Empty);
         sOut = sOut.Replace("&amp;", "&");
         sOut = sOut.Replace("&gt;", ">");
         sOut = sOut.Replace("&lt;", "<");
         return sOut;
     }
}

Ответ 10

Удалить изображение из строки, используя регулярное выражение в С# (поиск изображений, выполняемый идентификатором изображения)

string PRQ=<td valign=\"top\" style=\"width: 400px;\" align=\"left\"><img id=\"llgo\" src=\"http://test.Logo.png\" alt=\"logo\"></td>

var regex = new Regex("(<img(.+?)id=\"llgo\"(.+?))src=\"([^\"]+)\"");

PRQ = regex.Replace(PRQ, match => match.Groups[1].Value + "");

Ответ 11

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

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

Ответ 12

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

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

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

System.out.println(html);

Ответ 13

Этот фрагмент кода может помочь вам легко удалить любые HTML-теги:

import re
string = str(<a href="blah">blah</a>)
replaced_string = re.sub('<a.*href="blah">.*<\/a>','',string) // remember, sub takes 3 arguments.

Вывод - пустая строка.

Ответ 14

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

/// <summary>
/// Converts an Html string to plain text, and replaces all br tags with line breaks.
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
[Extension()]
public string ToPlainText(string s)
{

    s = s.Replace("<br>", Constants.vbCrLf);
    s = s.Replace("<br />", Constants.vbCrLf);
    s = s.Replace("<br/>", Constants.vbCrLf);


    s = Regex.Replace(s, "<[^>]*>", string.Empty);


    return s;
}

Надеюсь, что это поможет.