delphi - 删除元生成器 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 生成它?
还是有其他方法可以摆脱它?
解决方案
正如@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 正则表达式语法,您应该找到一些很好的资源,包括在线检查器来测试您的表达式是否按照您的想法执行。
推荐阅读
- node.js - 我在哪里设置'NODE_OPTIONS="--max-old-space-size=2048"'
- ios - 以编程方式准备 segue,但出现错误:没有带有标识符的 segue '
'' - python - 如何重新排列字典键的顺序?
- java - java.lang.IllegalStateException:未设置位置 - 启动时
- ruby - 如何修复“在'+'中:没有从整数到字符串的隐式转换”?
- java - 调用此方法时如何放置 gnerics?
- dask - 如何删除使用 register_worker_callback() 添加的回调?
- ruby-on-rails - 页面加载不采取行动?
- android - 复选框在 Android 5.02 设备上的位置错误
- c# - 如何使用 LINQ 防止多个用户同时更新一条记录