[英]Regular expression to remove HTML tags
我正在使用以下正則表達式從字符串中刪除 html 標簽。 除了我留下結束標簽之外,它可以工作。 如果我嘗試刪除: <a href="blah">blah</a>
它會留下<a/>
。
我根本不知道正則表達式語法,並且摸索了這個。 有正則表達式知識的人可以為我提供一個有效的模式。
這是我的代碼:
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>
標簽。
使用正則表達式解析 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;
要轉這個:
'<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();
}
為了刪除標簽之間的空格,您可以使用以下方法在輸入 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 前后空格的文本:“ test text test 1 test 2 test 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。
所以大家談論的 HTML 解析器是Html Agility Pack 。
如果它是干凈的 XHTML,您還可以使用System.Xml.Linq.XDocument
或System.Xml.XmlDocument
。
可以使用:
Regex.Replace(source, "<[^>]*>", string.Empty);
/<\/?[\w\s]*>|<.+[\W]>/g
這將剝離所有 HTML 元素並留下文本。 這甚至適用於格式錯誤的 HTML 元素(即缺少結束標記的元素)
參考和示例(Ex.10)
如果您只需要找到開始標簽,您可以使用以下正則表達式,它將標簽類型捕獲為 $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”標志,那么您可以使用.
反而。與結束標簽一起使用的示例: https : //regex101.com/r/MGmzrh/1
不帶結束標簽的使用示例: https : //regex101.com/r/MGmzrh/2
Regex101 對我所做的也有一些解釋:)
您可以使用現有的庫來去除 html 標簽。 一個好的是Chilkat C# Library 。
如果您要做的只是刪除標簽(而不是弄清楚結束標簽的位置),我真的不知道為什么人們如此擔心它。
這個正則表達式似乎可以處理我可以扔的任何東西:
<([\\w\\-/]+)( +[\\w\\-]+(=(('[^']*')|("[^"]*")))?)* *>
分解:
<([\\w\\-/]+)
- 匹配開始或結束標簽的開頭。 如果你想處理無效的東西,你可以在這里添加更多( +[\\w\\-]+(=(('[^']*')|("[^"]*")))?)*
- 該位匹配屬性 [0, N] 次 ( *
at然后結束)
+[\\w\\-]+
- 是空格后跟屬性名稱(=(('[^']*')|("[^"]*")))?
- 並非所有屬性都有賦值( ?
)
('[^']*')|("[^"]*")
- 有賦值的屬性,值是帶單引號或雙引號的字符串。不允許跳過結束引號到讓事情發揮作用*>
- 整個事情以任意數量的空格結束,然后是右括號顯然,如果有人向其拋出超級無效的 html,這會搞砸,但它適用於我想出的任何有效內容。 在這里測試一下:
const regex = /<([\\w\\-/]+)( +[\\w\\-]+(=(('[^']*')|("[^"]*")))?)* *>/g; const byId = (id) => document.getElementById(id); function replace() { console.log(byId("In").value) byId("Out").innerText = byId("In").value.replace(regex, "CUT"); }
Write your html here: <br> <textarea id="In" rows="8" cols="50"></textarea><br> <button onclick="replace()">Replace all tags with "CUT"</button><br> <br> Output: <div id="Out"></div>
這是我使用了很長時間的擴展方法。
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;
}
}
使用c#中的正則表達式從字符串中刪除圖像(圖像搜索由圖像id執行)
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 + "");
為什么不嘗試不情願的量詞? htmlString.replaceAll("<\\\\S*?>", "")
(這是Java,但主要是展示這個想法)
簡單的方法,
String html = "<a>Rakes</a> <p>paroladasdsadsa</p> My Name Rakes";
html = html.replaceAll("(<[\\w]+>)(.+?)(</[\\w]+>)", "$2");
System.out.println(html);
這段代碼可以幫助您輕松刪除任何 html 標簽:
import re
string = str(<a href="blah">blah</a>)
replaced_string = re.sub('<a.*href="blah">.*<\/a>','',string) // remember, sub takes 3 arguments.
輸出是一個空字符串。
這是我使用簡單的正則表達式創建的擴展方法,用於從字符串中刪除 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;
}
希望有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.