【问题标题】:Can you use Regex but keep formatting?您可以使用正则表达式但保持格式化吗?
【发布时间】:2014-04-30 17:24:32
【问题描述】:

我有这行代码允许我删除在我的文本中显示的 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 中显示。 任何建议或支持将不胜感激。谢谢你。

【问题讨论】:

  • 这是什么语言? c#?
  • 是的 c# 在使用 Visual Studio 的 mvc 4 项目中谢谢你
  • 可以在此处找到有关该问题的一些背景信息:forum.pdfsharp.net/viewtopic.php?f=2&t=2792 adandrea808 只需要一个纯文本字符串,还需要一个反映已删除 HTML 标记的 Font 对象。这个问题具有误导性,因为格式不应保留在字符串中。
  • 是否有任何简单的解决方案可以让我的文本以正确的格式显示,或者我只能显示纯文本?我不确定我的代码中是否还有其他问题导致了这个问题,或者这是一个不允许它正确显示的 pdfsharp 功能?任何更多的帮助将不胜感激。提前谢谢你。

标签: c# html regex formatting pdfsharp


【解决方案1】:

这听起来很像一个过滤器,可以用来防止跨站点脚本攻击。这个想法是保留一个被认为是安全或可取的 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 属性,以便保留像 &lt;span style="..."&gt; 这样的格式化元素。

【讨论】:

  • 不幸的是,乔尔这不起作用,它只是返回了包含在文本显示中的所有标签的描述。有什么我应该修改的吗?或者您对如何保持格式设置但删除所有标签不显示有任何其他想法?非常感谢
  • 此解决方案仅在 report.Description 是 HTML 源代码时才有效。如果 HTML 标签出现在呈现的 HTML(您的显示文本)中,则可能意味着标签周围的尖括号已经转义为 <和>在 HTML 源代码中。如果是这种情况,那么修改原始正则表达式以匹配转义形式可能会起作用。
  • 在我的 mvc 模型中,我有这段代码,这就是描述字段的来源。我假设它是html。公共类报告{公共字符串描述{获取;放; }
  • joel,你能给我更多关于“修改你的原始正则表达式以匹配转义形式”的信息吗?我的第一个正则表达式代码没有显示任何标签,但我只需要允许显示一些格式。
  • 可能类似于 "<.*?>| "会为你工作。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2010-09-29
  • 2022-06-13
  • 2021-06-30
相关资源
最近更新 更多