2016-02-29 134 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

第一个向后看可以确保我们正在搜索一个双引号,如果在双引号之前有一个单词跟着一个等号,那么第二个匹配就会失败,否则,如果双引号后跟空格,后跟一个闭角尖括号(可能以正斜杠开头),或者当有空格后面跟着一个单词后跟一个等号。