【问题标题】:Regex with HTML tags带有 HTML 标签的正则表达式
【发布时间】:2015-06-25 13:47:24
【问题描述】:

我有这个正则表达式:

(\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>

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

【问题讨论】:

  • 您使用的是什么语言,您到底想匹配什么?我会考虑为此任务使用解析器而不是正则表达式。
  • 对于每个愉快地抛出“不要使用正则表达式解析 html”的人来说,使用正则表达式从 html 中检索单个标签或内容是完全可以的。就像任何其他类型的文本一样。这不是解析。
  • 我得到了属性和属性值的匹配,这是你想要匹配的吗?您能否提供所需输出的示例以及您现在得到的结果?
  • 只有一个字符的值我得到这样的东西:“1,但我想得到这个:1 但是,当字符串大于一个字符时,一切顺利。

标签: html regex html-parsing


【解决方案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));
   }


【讨论】:

  • 我自己喜欢正则表达式,但这不是您的情况的正确解决方案。你甚至可以使用你的regex with a slight modification,但它不是正确的工具。
【解决方案2】:

我认为您正在使用您的正则表达式尝试一些过于复杂且最终不正确的东西。

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

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

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

<foo bar='fu"bar'>

属性的值是fu,而实际上是fu"bar

【讨论】:

  • 我怎样才能只使用两个捕获组?
  • 你不能,因为正则表达式是regular。从数学上讲,你不能用它们来解析平衡的表达式。
【解决方案3】:

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

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

没有捕获组名称:

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

包括引号:

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

更新:如需更深入的使用,请尝试HTML Agility Pack

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2014-08-23
    • 2014-06-02
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多