我有这个正则表达式:
(\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>
即使只有一个字符,我也不知道如何修改此正则表达式以正确捕获字符。
答案 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));
}
答案 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。