【问题标题】:formatting html in c#在c#中格式化html
【发布时间】:2011-02-20 18:35:05
【问题描述】:

我在 c# 中有一个变量,其中包含一些这样的字符串

string myText="my text  which contains <div>i am text inside div</div>";

现在我想用"&lt;br&gt;" 替换所有“\n”(换行符),用于此变量的数据,div 内的文本除外。

我该怎么做??

【问题讨论】:

  • 字符串是否只包含一个div?或任何位置的任意数量的 div?
  • 我假设第二个 &lt;div&gt; 应该是 &lt;/div&gt; ?

标签: c# html-parsing


【解决方案1】:

其他人建议使用 HTMLAgilityPack 等库。前者确实是一个不错的工具,但如果您不需要超出您要求的 HTML 解析功能,那么一个简单的解析器就足够了:

    string ReplaceNewLinesWithBrIfNotInsideDiv(string input) {

        int divNestingLevel = 0;
        StringBuilder output = new StringBuilder();
        StringComparison comp = StringComparison.InvariantCultureIgnoreCase;

        for (int i = 0; i < input.Length; i++) {
            if (input[i] == '<') {
                if (i < (input.Length - 3) && input.Substring(i, 4).Equals("<div", comp)){
                    divNestingLevel++;
                } else if (divNestingLevel != 0 && i < (input.Length - 5) && input.Substring(i, 6).Equals("</div>", comp)) {
                    divNestingLevel--;
                }
            }

            if (input[i] == '\n' && divNestingLevel == 0) {
                output.Append("<br/>");
            } else {
                output.Append(input[i]);
            }
        }

        return output.ToString();
    }

这也应该处理嵌套的 div。

【讨论】:

  • 很好......我正在编写这样一个你刚刚完成的例子......顺便说一下,这个文本工作得很好...... string test =“我的文本! \n 其中包含
    i am text !\n" + "inside
    nested div!\n
    div
    " + " outside of div !\n这个工作吗";
【解决方案2】:

对于这样的事情,您需要解析 HTML 以区分您确实想要替换的部分和您不想替换的部分。

我建议查看HTML agility pack - 它可以解析 HTML 片段以及格式错误的 HTML。然后,您可以使用 XPath 表示法查询生成的解析树并在选定的节点上进行替换。

【讨论】:

    【解决方案3】:

    这需要一些相当复杂的正则表达式,超出我的范围。

    但你可以尝试拆分字符串:

    string[] parts = myText.Split("<div>", "</div>");
    
    for (int i = 0; i < parts.Length; i += 2)  // only the even parts
      parts[i] = string.Replace(...);
    

    然后使用 StringBuilder 重新组装零件。

    【讨论】:

    • 我记得一个关于 HTML 和 RegEx 的答案:stackoverflow.com/questions/1732348/…
    • @gvs:这就是为什么 Oded 有正确答案的原因,原则上。但 Praveen 可能会觉得“仅仅”替换几行换行有点让人不知所措。
    • myText.Split("
      ", "
      "); // 只接受字符数组进行拆分,不能用它拆分字符串!!
    • @Praveen,我认为 param strings 重载 os Split() 可能是 Fx4 中的新功能。
    【解决方案4】:

    我会在 div 上拆分字符串,然后查看以“div”开头的标记,然后不要用 BR 替换 \n,如果它确实以 div 开头,那么您需要找到关闭的 div 并在其上拆分。 . 然后取第二个令牌并做你刚刚做的事情......当然,因为你将不得不继续将令牌附加到主字符串......我将在几分钟内编写一个示例......

    【讨论】:

    • 这里需要转义Html标签。
    • 我的基本想法也有同样的问题......你必须处理嵌套的 div 并确保你知道你所处的嵌套级别以确定何时回到 div 之外。 .
    【解决方案5】:

    像这样使用 string.Replace() 方法:

     myText = myText.Replace("\n", "<br>")
    

    您可以考虑使用 Environment.NewLine 属性来查找换行符。你确定他们不是 \n\r 或 \r\n 等等...

    如果您不想解析,您可能必须先将 div 中的文本提取出来。使用正则表达式找到它并将其删除,然后按照上面的方法执行 Replace(),然后将字符串重新组合在一起。

    【讨论】:

    • 这也将替换 &lt;div&gt; 块内。
    • 我也在想一个正则表达式的解决方案,但是我在正则表达式方面太弱了,请建议它的正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多