在c#中格式化html

时间:2011-02-20 18:35:05

标签: c# html-parsing

我在c#中有一个变量,持有像这样的字符串

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

现在我想用\n替换所有“"<br>"”(换行符号)此变量的数据,除了div中的文本。

我该怎么做?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

其他人建议使用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。

答案 2 :(得分:1)

这需要一些相当复杂的RegEx,不在我的联盟中。

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

string[] parts = myText.Split("<div>", "</div>");

for (int i = 0; i < parts.Length; i += 2)  // only the even parts
  parts[i] = string.Replace(...);

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

答案 3 :(得分:0)

我会在div上拆分字符串,然后查看令牌,如果它以“div”开头,那么如果它以div开头则不要用BR替换\ n然后你需要找到结束div并拆分它。然后拿第二个令牌做你刚刚做的...当然,因为你将不得不将令牌附加到一个主字符串......我会在几分钟内编写一个样本......

答案 4 :(得分:-1)

使用string.Replace()方法,如下所示:

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

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

如果您不想解析,可能必须先将div中的文本拉出来。使用正则表达式找到它并删除它,然后执行上面的Replace(),然后将字符串放回去。