C# 第三方格式的HTML RTF字符串分解

C# 第三方格式的HTML RTF字符串分解,c#,regex,string,C#,Regex,String,我已经决定带着我的问题来这里,因为我的脑袋已经炸了,而且我还有一个最后期限。我的基本场景是,在我们的系统上,我们将RTF HTML保存在数据库中,例如: This is<strong> Line 1</strong> with more <strong>Bold and <em>italic</em></strong> text "This is " "<strong>Line 1</strong>

我已经决定带着我的问题来这里,因为我的脑袋已经炸了,而且我还有一个最后期限。我的基本场景是,在我们的系统上,我们将RTF HTML保存在数据库中,例如:

This is<strong> Line 1</strong> with more <strong>Bold and <em>italic</em></strong> text
"This is "
"<strong>Line 1</strong>"
" with more "
"<strong>Bold and <em>italic</em></strong>"
" text"
其呈现如下:

这是第1行,文本更粗体和斜体

这些HTML字符串被导出为PDF,到目前为止,使用的PDF渲染器可以正确读取和渲染此HTML。。。不再是了。因此,我必须以手动方式完成这项工作,并单独阅读每个标签,并在构建每个段落时动态应用样式。好的

我的想法是建立一个字符串列表,例如:

This is<strong> Line 1</strong> with more <strong>Bold and <em>italic</em></strong> text
"This is "
"<strong>Line 1</strong>"
" with more "
"<strong>Bold and <em>italic</em></strong>"
" text"
每一行要么有一个未格式化的字符串,要么包含给定字符串的所有样式标记

然后,我应该能够一次构建一个字符串的段落,检查标记并在需要时应用它们

然而,我在周五下午的第一个跨栏比赛中精神失常了??无法确定如何建立我的列表。我猜我会用正则表达式

如果有人能建议我如何才能得到这样一个名单将不胜感激

编辑

根据下面建议的Python示例,我实现了以下内容,但这只提供了由标记包围的元素,没有未格式化的文本:

        var stringElements = Regex.Matches(paragraphString, @"(<(.*?)>.*?</\2>)", RegexOptions.Compiled)
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();

太接近了…

我先道歉,因为我的答案是用Python编写的,不过我希望这能为您提供一些指导

import re

s = 'This is<strong> Line 1</strong> with more <strong>Bold and <em>italic</em></strong> text'

matches = [i[0] for i in re.findall(r'(<(.*?)>.*?</\2>)', s)]

for i in matches:
    s = s.replace(i, '\n' + i + '\n')

print(s)
给出:

This is
<strong> Line 1</strong>
 with more 
<strong>Bold and <em>italic</em></strong>
 text

因此,我通过使用出色的Html敏捷包找到了一个解决方案:

        var doc = new HtmlDocument();
        doc.LoadHtml(paragraphString);

        var htmlBody = doc.DocumentNode.SelectSingleNode(@"/p");
        HtmlNodeCollection childNodes = htmlBody.ChildNodes;
        List<string> elements = new List<string>();

        foreach (var node in childNodes)
        {
            elements.Add(node.OuterHtml);
        }
请注意,我之前从paragraphString中删除了围绕html的段落标记,但在本例中保留了它们。所以传入的字符串实际上是:

<p>This is<strong> Line 1</strong> with more <strong>Bold and <em>italic</em></strong> text</p>

我认为正则表达式的答案有一定的可信度,我确信其中有一些东西只是排除了非“点头”元素。这似乎更好,因为您可以以类结构的方式访问元素。

感谢Rahlf。。。稍后我会仔细看一看。我猜re.findall是一个正则表达式?我想知道它是否直接转到C。。。我会发现并让你知道的。当然。是的,re.findall是Python正则表达式正则表达式库中的一个方法。。。我似乎只得到以开头的2x字符串,而没有得到任何未格式化的字符串。关我会看看我是否可以玩这个,但雷格克斯不是我的强手!再次感谢Rahlf23I,我可能会补充说,我不太清楚For循环中到底发生了什么,所以想知道这是否与我们看到的不同有关?带有For循环的行实际上是一个列表理解,在Python中非常有用!