【问题标题】:How do I modify this string to correct bad formatting?如何修改此字符串以更正错误的格式?
【发布时间】:2014-01-18 21:45:18
【问题描述】:

以下是我遇到的一些标记的两个示例:

Incorrect: "<span>Some info<br /></span>"
Correct: "<span>Some info</span><br />"

Incorrect: "<span>Some other kind of info. <br /> More info</span>"
Correct: "<span>Some other kind of info. More info</span><br />"

我想要做的是将每个中断分成一行,以便我可以将一行显示为表格行。目前,我进入并将所有&lt;br /&gt; 替换为|,以便我可以拆分|。问题是我给我留下了一个未闭合的跨度。

我在想在这种情况下,我所要做的就是将&lt;br /&gt; 之后的&lt;/span&gt; 的下一个实例移动到&lt;br /&gt; 之前。但是在这种情况下,中断之后但跨度之前有更多文本,我需要将整个卡盘移动到换行之前。

我对正则表达式很不满意,所以我真的想不出一个正则表达式解决方案。但是常规的子字符串操作很好,我没有偏好。有什么想法吗?

【问题讨论】:

  • 这似乎首先是一个 HTML 问题(“当我看到这个输入时,正确的标记是什么?”)和一个 C# 实现问题,只有在你弄清楚了所需的输出之后。如果您需要帮助使用 C# 有效地进行转换,请在找出“纠正”这些转换规则后回来。
  • 您能提供一个示例输出吗?
  • 已更新。简而言之,我确实需要能够接受 html 标记,找到中断,并确保之前打开的 span 在
    之前关闭
  • 我建议您澄清 HTML 文本可能包含多行。 标签可能出现在第 5 行,但 可能出现在第 15 行。此外,一个中断可能在一个 sapn 中出现超过 1 次。这些细节让它更有趣!

标签: c# regex substring


【解决方案1】:

如果我理解正确,您需要一个像 HtmlAgilityPack 这样的 Html 解析器

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(orghtml);

var brs = doc.DocumentNode.SelectNodes("//span/br"); //all br's in span's
foreach(var br in brs )
{
    var span = br.ParentNode;
    span.ParentNode.InsertAfter(HtmlAgilityPack.HtmlNode.CreateNode("<br>"), span);
    br.Remove();
}
var newhtml = doc.DocumentNode.OuterHtml;

输入:

<span>Some info<br /></span>
<span>Some info</span><br />
<span>Some other kind of info. <br /> More info</span>
<span>Some other kind of info. More info</span><br />

输出:

<span>Some info</span><br>
<span>Some info</span><br>
<span>Some other kind of info.  More info</span><br>
<span>Some other kind of info. More info</span><br>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多