正則表達式僅替換HTML標記中的引號

asp.net c# html-agility-pack regex

我有以下字符串:

<div id="mydiv">This is a "div" with quotation marks</div>

我想使用正則表達式返回以下內容:

<div id='mydiv'>This is a "div" with quotation marks</div>

請注意div中的id屬性現在如何被撇號包圍?

我怎麼能用正則表達式做到這一點?

編輯:我不是在尋找一個魔術子彈來處理每種情況下的每一個邊緣情況。我們都應該厭倦使用正則表達式解析HTML,但在這種特殊情況下,對於我的特殊需要,正則表達式是解決方案......我只需要一些幫助來獲得正確的表達式。

編輯#2: Jens幫我找到了一個解決方案,但任何隨機訪問此頁面的人都應該長時間地考慮使用這個解決方案。在我的情況下,它的工作原理是因為我對我將要處理的字符串類型非常有信心。我知道危險和風險,並確保你這樣做。如果你不確定你是否知道它可能表明你不知道也不應該使用這種方法。你被警告過了。

一般承認的答案

這可以通過以下方式進行:我認為你要替換的每一個實例" ,這是之間的<>'

所以,你在你的文件中找到每個"在後面尋找一個< ,然後向前看一個> 。正則表達式看起來像:

(?<=\<[^<>]*)"(?=[^><]*\>)

您可以根據自己的喜好替換找到的字符,也許使用Regex.Replace

注意:雖然我發現Stack Overflow社區最友好和最有幫助,但在我看來,這些正則表達式/ HTML問題的回答有點過於憤怒。畢竟,這裡的問題不會問“什麼正則表達式匹配所有有效的HTML,並且與其他任何內容都不匹配。”


熱門答案

我知道您已經意識到使用Regex進行這些替換的危險。我已經為那些尋找一種更穩定的方法的人添加了以下答案,如果你想要一個能夠隨著輸入文檔的變化而繼續工作的解決方案。

使用HTML Agility Pack( 項目頁面nuget ),這可以解決問題:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因