【问题标题】:Add character to empty html tags with c# and regex使用 c# 和正则表达式将字符添加到空 html 标签
【发布时间】:2013-07-26 08:53:59
【问题描述】:

我想在一个字符串中查找所有空的HTML标签,例如:

<div></div>
<span>test</span>
<a></a>

并为该字符串中的所有空标签添加一个空格或一个字符:

<div>something</div>
<span>test</span>
<a>something</a>

我有一个匹配所有空标签的正则表达式,但我不确定替换标签的最佳方法是什么。

正则表达式:

<(\w+)(?:\s+\w+="[^"]+(?:"\$[^"]+"[^"]+)?")*>\s*</\1>

【问题讨论】:

  • 提示:使用 HtmlAgilityPack(正则表达式是多余的)
  • regex is not overkill. it is "underkill" :) 使用 HTML/XML 解析器并在 DOM 树上进行交互 - 这将为您节省很多痛苦。
  • 从我读到的内容来看,agilitypack 可能会弄乱 html 的其余部分,从而“修复”某些标签,例如 ..

标签: c# html regex


【解决方案1】:

使用HtmlAgilityPack

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach(HtmlNode node in doc.DocumentElement.SelectNodes("//*").Where(x=>x.InnerText==""))
{
       node.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(input), node);
}
doc.Save(yourFile);

【讨论】:

  • 如果我没有完整的 html 文档怎么办?我只有一个较大文档的一小部分,我只想替换一些标签.. 还有路要走吗?我觉得人群刚刚决定,如果 HTML 和 Regex 在一个问题中被提及,HTML 解析器是唯一的选择......
  • @f01 不管你的 html 是什么形式的......无论是incomplete,no end tags!,not an html!!! 这个解析器仍然可以完美地工作,没有任何问题......
  • @f01 您可以使用 (?&lt;=&lt;.*?[^/]&gt;)(?=&lt;/.*?&gt;) 之类的正则表达式并将其替换为 something.. 但是我可以给您 1000 种可能破坏您的应用程序的情况跨度>
【解决方案2】:

说明

通过正则表达式处理这可能不是最好的方法,但是因为可能有使用正则表达式的原因,例如“我不允许安装 HTMLAgilityPack”,那么这个表达式将:

  • 查找所有只是打开标签后跟关闭标签的标签
  • 将避免在 HTML 中使用正则表达式进行模式匹配困难的许多边缘情况

正则表达式:(&lt;(\w+)(?=\s|&gt;)(?:[^'"&gt;=]*|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*&gt;)(&lt;\/\2&gt;)

替换为:$1~~~NewValue~~~$3

示例

Live Demo

示例文本

注意第一行有一些非常困难的边缘情况

<a onmouseover=' str=" <a></a> " ; if ( 6 > 4 ) { funDoSomething(str); } '></a>
<div></div>
<span>test</span>
<a></a>

替换后的文字

<a onmouseover=' str=" <a></a> " ; if ( 6 > 4 ) { funDoSomething(str); } '>~~~NewValue~~~</a>
<div>~~~NewValue~~~</div>
<span>test</span>
<a>~~~NewValue~~~</a>

【讨论】:

    【解决方案3】:

    使用Html Agility Pack 进行Html 解析never regex

    【讨论】:

    • -1 因为您提出的解决方案并没有真正提供问题的答案。充其量这是对一个相当具体的请求的一些模糊的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多