用于第三方格式化的HTML RTF字符串细分

时间:2018-03-09 16:09:36

标签: c# regex string

我已经决定带着我的问题来到这里,因为我的头已经炒了,我有一个截止日期。我的基本情况是,在我们的系统中,我们将RTF HTML保存在数据库中,例如:

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"

每一行都有一个未格式化的字符串或包含给定字符串的所有样式标记。

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

然而,我在第一道障碍(星期五下午综合症?)的精神上失败了,并且无法弄清楚如何建立我的清单。我猜我打算使用RegEx。

如果有人能够就如何获得这样的清单提出建议,我们将不胜感激。

修改

按照下面建议的Python示例,我实现了以下内容,但这只给了我用标签包围的元素,而没有任何未格式化的文本:

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

如此接近......

2 个答案:

答案 0 :(得分:1)

我在前面道歉,因为我的答案是用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

答案 1 :(得分:0)

所以我通过使用光荣的Html Agility Pack找到了解决方案:

        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>

我认为RegEx的答案有一定的可信度,我相信其中有一些东西只是排除了非节点&#39;元素。这看起来更好,因为你可以通过某种方式访问​​类结构中的元素。