首页 > 解决方案 > 删除元生成器 MSHTML

问题描述

当我阅读使用(设计模式)生成的 HTML 页面的内容时TWebBrowser,例如使用以下代码:

function GetHTML(w: TWebBrowser): String;
Var
  e: IHTMLElement;
begin
  Result := '';
  if Assigned(w.Document) then
  begin
     e := (w.Document as IHTMLDocument2).body;

     while e.parentElement <> nil do
     begin
       e := e.parentElement;
     end;

     Result := e.outerHTML;
  end;
end;

它在 之前添加 META 标签</HEAD>,例如:

<META content="MSHTML 6.00.2900.2180" name=GENERATOR>

或者...

<META name=GENERATOR content="MSHTML 11.00.10570.1001">

阅读时有没有办法摆脱标签outerHTML

还是首先阻止 MSHTML 生成它?

还是有其他方法可以摆脱它?

标签: delphiwebbrowser-controlc++buildermshtml

解决方案


正如@Remy Lebeau 所指出的,您无法控制这种行为AFAIK。但是,如果您愿意,很容易摆脱它。

就我个人而言,我会使用实现 Perl 兼容正则表达式 (PCRE) 的正则表达式 (System.RegularExpressionsCore),它肯定已经出现在最近的几个版本中,但我不知道它是什么时候引入的。

您将需要使用 RegEx 设置,例如:

  <META[^<]*GENERATOR\s*> 

匹配所有以 <META does not have any > 在字符串中并以 GENERATOR(零个或多个空格)> 结尾的字符串。您可以设置多行和不区分大小写匹配的选项。将 ReplaceString 设置为空字符串,然后您的代码(我使用 C++,因为您使用 C++ Builder 标记)将如下所示:

TPerlRegEx     * pRegEx;

  pRegEx=new TPerlRegEx();
  pRegEx->Replacement=UnicodeString(L"");
  pRegEx->RegEx=UnicodeString(L"<META[^>]*GENERATOR\\s*>");
  pRegEx->Options=TPerlRegExOptions() << preCaseLess << pre MultiLine;
  pRegEx->Subject=szOuterHTML;
  pRegEx->ReplaceAll();
  delete(pRegEx);

当然还有其他方法可以做到这一点,比如使用 XML 节点解析器并删除节点,但我认为 RegEx 是干净和简单的。在处理文本文件时,它是一个很棒的工具。

如果您使用 Google 正则表达式语法,您应该找到一些很好的资源,包括在线检查器来测试您的表达式是否按照您的想法执行。


推荐阅读