簡體   English   中英

刪除HTML標簽的正則表達式

[英]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.XDocumentSystem.Xml.XmlDocument

可以使用:

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

剝離 HTML 元素(帶/不帶屬性)

/<\/?[\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\\S] - 幾乎像. 但允許任何空格(如果標簽之間有新行,也將匹配)。 如果您使用正則表達式“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("&nbsp;", String.Empty);
         sOut = sOut.Replace("&amp;", "&");
         sOut = sOut.Replace("&gt;", ">");
         sOut = sOut.Replace("&lt;", "<");
         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;
}

希望有幫助。

選擇所有內容,除了那里的內容:

(?:<span.*?>|<\/span>|<p.*?>|<\/p>)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM