正则表达式与HTML标签

时间:2015-06-25 13:47:25

标签: html regex html-parsing

我有这个正则表达式:

(\S+)=[""']?((?:.(?![""']?\s+(?:\S+)=|[>""']))+.)[""']?

这个正则表达式表达式将从HTML字符串中提取标记的名称和值,一切正常,但是,当我有一个字符时,正则表达式将捕获左侧引号和字符。

这是我的字符串:

<select title="Campo" id="6:7" style="width: auto; cursor: pointer;" runat="server" controltype="DropDownList" column="Dummy_6"><option value="0">Value:0</option><option selected="selected" value='1'>Value:1Selected!</option></select>

即使只有一个字符,我也不知道如何修改此正则表达式以正确捕获字符。

3 个答案:

答案 0 :(得分:1)

您应该使用HTML解析器执行此任务,正则表达式无法正确处理HTML。

要收集所有标记名称以及属性名称和值,我建议使用以下基于HtmlAgilityPack的解决方案:

var tags = new List<string>();
var result = new List<KeyValuePair<string, string>>();
HtmlAgilityPack.HtmlDocument hap;
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)
{ // html is a URL 
    var doc = new HtmlAgilityPack.HtmlWeb();
    hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
    hap = new HtmlAgilityPack.HtmlDocument();
    hap.LoadHtml(html);
}
var nodes = hap.DocumentNode.Descendants().Where(p => p.NodeType == HtmlAgilityPack.HtmlNodeType.Element);
if (nodes != null)
   foreach (var node in nodes)
   {
      tags.Add(node.Name);
      foreach (var attribute in node.Attributes)
         result.Add(new KeyValuePair<string, string>(attribute.Name, attribute.Value));
   }

enter image description here
enter image description here

答案 1 :(得分:0)

我认为你正在用你的正则表达式尝试一些过于错综复杂的东西,并且最终是错误的。

如果你想天真地解析HTML属性:这个正则表达式可以解决这个问题:

(\S+)=(?:"([^"]+)"|'([^']+)')

请注意,它解析正则表达式的不同分支中的单引号和双引号值。您的正则表达式会在以下代码中找到:

<foo bar='fu"bar'>

当属性fu时,属性的值为fu"bar

答案 2 :(得分:0)

有更好的方法来解析HTML,但无论如何,这是我对你的问题的看法。

(?<attr>(?<=\s).+?(?==['"]))|(?<val>(?<=\s.+?=['"]).+?(?=['"]))

没有捕获组名称:

((?<=\s).+?(?==['"]))|((?<=\s.+?=['"]).+?(?=['"]))
报价包括:

((?<=\s).+?(?==['"]))|((?<=\s.+?=)['"].+?['"])

更新:要进行更深入的使用,请尝试HTML Agility Pack