Регулярное выражение для удаления тегов 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(" ", String.Empty);
sOut = sOut.Replace("&", "&");
sOut = sOut.Replace(">", ">");
sOut = sOut.Replace("<", "<");
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;
}
Надеюсь, что это поможет.