2016-02-29 176 views
3

我有些情況下,我的客戶端向我發送一個html字符串,其元素屬性結構不正確。就像這樣:將雙引號內的雙引號替換爲html屬性

<img src="../imgTest.jpg" alt="Something "quoted here, or here""> 

我怎樣才能動態改變這些情況下,以這樣的未來?

<img src="../imgTest.jpg" alt="Something 'quoted here, or here'"> 

我需要這個html不顯示在瀏覽器上,但要做一些操作。

我使用HtmlAgilityPack控制HTML的問題,但對於這些情況下,它改變了我的html字符串這一點,它是不是我想要的:

<img src="../imgTest.jpg" alt="Something" quoted="" here,="" or="" here=""> 

我與HtmlAgilityPack代碼:

var htmlDoc = new HtmlDocument(); 
htmlDoc.OptionFixNestedTags = true; 
htmlDoc.LoadHtml(myHtmlStr); 

var htmlError = htmlDoc.ParseErrors.SafeAny(); 

if (!htmlError) 
    myHtmlStr = htmlDoc.DocumentNode.InnerHtml; 
+1

嗯,恐怕沒有正則表達式的解決方案,這將看起來不錯,安全。試試['(?<= <\ w + \ s [^ <] *)(?<!\ w + =)「(?!\ s * /?> | \ s + \ w + =」)'](http:/ /regexstorm.net/tester?p =(%3F%3C%3D%3C%5CW%2B%5CS%5B%5E%3C%5D *)(%3F%3C!%5CW%2B%3d)的22%( %3F!%5CS *%2F%3F%3E%7C%5CS%2B%5CW%2B%3D%22)I =%3cimg + SRC%3D%22%..%2fimgTest.jpg 22 + ALT%3D% 22%+%22quote + here%2c +或+ here%22%22%3e&r =%27)並替換爲'''。 –

+1

你的html片段是否像你的例子中的img一樣是單個元素?它總是具有相同的屬性,它們被破壞了嗎? –

+1

你可以嘗試像['(= \ s *「[^ =」>] *)「([^ =」>] *)「([^ =」>] *「)'](https:// regex101.com/r/iK0wN9/2),並用'$ 1'$ 2'$ 3'替換,這不是非常可靠:> –

回答

1

我的想法是匹配一個",如果它位於標籤內而不是屬性限定符。免責聲明:該解決方案可能無法在100%的情況下工作(如果名稱空間添加到元素/屬性名稱,它將需要適應),但是當標籤名稱立即跟在<之後時,它應該有效,使用雙引號作爲屬性值限定符,並且屬性內沒有符號。

使用

(?<=<\w+\b[^<]*)(?<!\w+=)"(?!\s*/?>|\s+\w+=") 

'取代。

請參閱regex demo

第一個向後看可以確保我們正在搜索一個雙引號,如果在雙引號之前有一個單詞跟着一個等號,那麼第二個匹配就會失敗,否則,如果雙引號後跟空格,後跟一個閉角尖括號(可能以正斜槓開頭),或者當有空格後面跟着一個單詞後跟一個等號。