多个不区分大小写的字符串替换性能

时间:2016-06-23 13:19:38

标签: c# regex

我想从HTML字符串中删除特定标记。我正在使用HtmlAgility,但这会删除整个节点。我想要提升'它保持innerHtml。它一切正常,但我有严重的性能问题。这让我通过regex.replace更改了string.replace,它已经快了4倍。更换需要不区分大小写。这是我目前的代码:

var scrubHtmlTags = new[] {"strong","span","div","b","u","i","p","em","ul","ol","li","br"};
var stringToSearch = "LargeHtmlContent";
foreach (var stringToScrub in scrubHtmlTags)
{
   stringToSearch = Regex.Replace(stringToSearch, "<" + stringToScrub + ">", "", RegexOptions.IgnoreCase);
   stringToSearch = Regex.Replace(stringToSearch, "</" + stringToScrub + ">", "", RegexOptions.IgnoreCase);
}

但仍然有改进:

  1. 应该可以摆脱&lt; b>以及&lt; / b&gt;在一次运行中我假设......
  2. 是否可以在一次运行中完成所有字符串替换?

3 个答案:

答案 0 :(得分:1)

要在一次运行中执行此操作,您可以使用此功能:

stringToSearch = Regex.Replace(stringToSearch, "<\\/?" + string.Format("(?:{0})", string.Join("|", scrubHtmlTags)) + ".*?>", "", RegexOptions.IgnoreCase);

但请记住,可能会在几种情况下失败。

答案 1 :(得分:1)

如果我是你的经理...... (koff,koff) ...我会拒绝你的代码告诉你,不,要求(!)你,在他的第一篇文章的第一篇文章中“听托马斯·阿尤布”。在你创建完全不可维护的代码的过程中,你是:代码是因为它似乎,给没有和别人说话的人,有“解决了“当时> 面临的直接问题。

回到原来的任务描述,你说你“希望从HTML字符串中删除特定的标签。”你进一步声明你已经在使用HtmlAgility (好,好......),< / i>然后你反对(!)它“删除整个节点。”

“'对不起,但是......”你到底想要做什么?一个“标签”,我推测,一个(DOM)“节点。”

所以,面对你所谓的“性能问题”,而不是(!)在你之前的代码中寻找不可避免的错误(!!),你决定谨慎对待这四个风,从而对项目和团队的其他成员施加影响。

而且,作为一名老朋友经理,我会介入其中。

我会锻炼我的“权威有其特权”并指示你...... 命令你......放弃你现在的方法,然后回去寻找并修复你的错误原始方法。但是,更进一步,我会命令你首先“找到”错误,然后呈现你提出的(!)解决方案给团队和我,之前授权您(按团队共识)实施您提议的修复。

(而且我想,在你花了相当多的时间“给我打个电话”(当然......),你会明白为什么我用这种方式回答,为什么我花时间在Stack-whatever.com上说了多少。)

答案 2 :(得分:-1)

你可以试试这个:

foreach (var stringToScrub in scrubHtmlTags)
{
   stringToSearch = Regex.Replace(
       stringToSearch, 
       "<\/?" + stringToScrub + ">", "", 
       RegexOptions.IgnoreCase);
}

但我会尝试使用一个表达式将它们全部删除。