0

我有一些纯文本,其中包含这样的换行符:

Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.

我想使用 HtmlAgility 包(如果需要)来清理 Html 并用 BR 替换新的换行符,除非它们已经在 HTML 标记中(请参阅 UL 标记中的 LI)

我可以使用 regx 轻松替换 BR,或者text.Replace(Environment.NewLine, "<br/>")如何排除它在标签中的情况?

谢谢。

4

2 回答 2

1

看来您只需要处理顶级 HTML 文本节点(文本节点没有子节点):

var html = "Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.ChildNodes
    .OfType<HtmlTextNode>()
    .ToList();

foreach (var node in textNodes)
    node.Text = node.Text.Replace(Environment.NewLine, "<br />");

这将产生如下内容:

Dear Person,<br />Hello and welcome to this example.<br />Todo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.</ul>
于 2013-02-01T12:04:49.223 回答
0
String sentence = "Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1\r\nitem 2</li>\r\n<li>item 3</li>\r\nThanks.";
String[] splits = Regex.Split(sentence, @"(<li>[^<]+</li>)");

for (Int32 i = 0; i < splits.Length; ++i)
{
    if (!splits[i].StartsWith("<li>"))
        splits[i] = splits[i].Replace("\r\n", "<br/>");
}

sentence = String.Join("", splits);

此外,不要使用 Environment.NewLine,因为它可能会有所不同,而您的字符串换行符将始终为“\r\n”。

于 2013-01-18T03:05:51.560 回答