【问题标题】:C# Regex to parse HTML string and add ids into each header tag?C# 正则表达式解析 HTML 字符串并将 id 添加到每个标题标签中?
【发布时间】:2014-03-27 16:27:55
【问题描述】:

我有一个 CMS 系统,我需要对 HTML 字符串进行一些自动格式化,然后才能将它们提供给客户端。所以在数据库中我可能有一个这样的 HTML 字符串:

> "<h2>Example Header</h2><p>Here is some text about that
> header.</p><h2>Another Header 2</h2></p>Well I got more information
> here.</p>"

我想为每个 H2 标记添加一个 ID 属性,该属性包含 H2 标记中的文本并删除了空格,这将用于锚链接。所以上面的例子会变成:

> "<h2 id="ExampleHeader">Example Header</h2><p>Here is some text about that
> header.</p><h2 id="AnotherHeader2">Another Header 2</h2></p>Well I got more 
> information here.</p>"

所以对于字符串中的每个 H2 都来自:

<h2>Header Example Text Right Here</h2>

收件人:

<h2 id="HeaderExampleTextRightHere">Header Example Text Right Here</h2>

空格已删除,但其他文本完全相同。如何使用正则表达式做到这一点?

【问题讨论】:

  • 不要使用regex to parse htmlHtmlAgilityPack 非常适合。
  • 虽然我很欣赏这种情绪。由于它的遗留性质和其他一些问题,我得到了具体的指示(我不同意)不要在这个项目中使用其他库。
  • 仅仅使用正则表达式来解析 HTML 已经够糟糕的了;使用正则表达式解析 HTML并向元素添加 ID 属性会损害您的心理健康。

标签: c# regex asp.net-mvc


【解决方案1】:

C# 中是否有可用的 HTML 处理库?那么请随它去。正则表达式可以方便地处理您的示例 html。但是对于复杂的场景,它不会被证明是安全的。

这是您的示例输入的正则表达式/替换。请记住,仅用于您的示例输入:

htmls = Regex.Replace(htmls, @"<h2>([^<]*)</h2>", "<h2 id=\"$1\">$1</h2>");

【讨论】:

  • 是的,我明白了。如果 h2 标签内有 HTML,可能会有问题吗?不过,这种情况不会发生。会不会有其他问题?
  • HTML ID 值中不能有空格,因此如果按原样使用,您的“示例标题”示例最终将成为非法 ID。此外,ID 必须是唯一的,因此如果您有两个或多个具有相同内容的 h2 标签,您最终会得到两个相同的 ID,这是非法的。
  • @DOTang 希望没有其他问题。
  • HTML 5 规定:“该值在元素的主子树中的所有 ID 中必须是唯一的,并且必须包含至少一个字符。该值不得包含任何空格字符。”
  • HTML 4 限制性更强:“ID 和 NAME 标记必须以字母 ([A-Za-z]) 开头,后跟任意数量的字母、数字 ([0-9] )、连字符 ("-")、下划线 ("_")、冒号 (":") 和句点 (".")。"
【解决方案2】:

你可以用这个:

Regex.Replace("<h2>XYZ</h2>", "<h2>(?<innerText>[^<]*)</h2>", x => string.Format("<h2 id=\"{0}\">{0}</h2>", x.Groups["innerText"]))

【讨论】:

  • 不完全是,没有删除 ID 的空格,但有了这个我就能让它工作:Regex.Replace(htmls, @"&lt;h2&gt;(?&lt;innerText&gt;[^&lt;]*)&lt;/h2&gt;", x =&gt; string.Format("&lt;h2 id=\"{0}\"&gt;{1}&lt;/h2&gt;", x.Groups["innerText"].Value.Trim().Replace(" ", string.Empty), x.Groups["innerText"]));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多