你可以使用正则表达式但保持格式化吗?

时间:2014-04-30 17:24:32

标签: c# html regex formatting pdfsharp

我有这行代码允许我删除在我的文本中显示的HTML标记,但它丢失了所有格式。我想知道是否有任何方法删除HTML标签,但保持文本的格式,如粗体,斜体等。这是代码行:

 report.Description = Regex.Replace(report.Description, "<.*?>|&nbsp;", string.Empty);

以下是显示说明字段的代码行:

        graphics.DrawString("" + report.Description, font2, XBrushes.Black, new XRect(margin, page.Height - (lineHeight * 35), page.Width, page.Height), XStringFormats.TopCenter);

我在reports.cs文件中也有这个公共类:

  public string Description { get; set; }

我正在使用PDFsharp将其显示在PDF中。 任何建议或支持将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

这听起来很像一个人可能创建的过滤器,以防止跨站点脚本攻击。我们的想法是保持一部分HTML元素被认为是安全或可取的,并丢弃所有其他元素。

Regex.Replace 的几种形式接受每次找到正则表达式匹配时调用的 MatchEvaluator 委托。保留某些元素的逻辑可以在委托中实现。

以下课程可能符合您的需求。

public static class HtmlFilter
{
    private static HashSet<string> _keep;

    static HtmlFilter()
    {
        _keep = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        _keep.Add("b");
        _keep.Add("em");
        _keep.Add("i");
        _keep.Add("span");
        _keep.Add("strong");
        // Add other tags as needed.
    }

    private static string ElementFilter(Match match)
    {
        string tag = match.Result("${tag}");

        if (_keep.Contains(tag))
            return match.Value;
        else
            return string.Empty;
    }

    public static string Apply(string input)
    {
        Regex regex = new Regex(@"</?(?<tag>\w*)[^>]*>|&nbsp;");
        return regex.Replace(input, new MatchEvaluator(ElementFilter));
    }
}

然后,您可以使用以下方式过滤报告说明:

report.Description = HtmlFilter.Apply(report.Description);

请注意,正则表达式会保留HTML属性,以便保留<span style="...">等格式设置元素。