其实这个程序很简单,首先是如何获取选定部分的HTML,还记得这段吗:

HTMLDoc := WebBrowser1.Document as IHTMLDocument2;
  SelectRange := HTMLDoc.selection.createRange() as IHTMLTxtRange;

这样 SelectRange.htmlText 就是选择部分的HTML了。

接着来实现 TrimBBSText() 函数,用于去除复制文字中的不可见乱码。


 1 {******************************************
 2  *
 3  *  TrimBBSText() 伪代码
 4  *
 5  ******************************************}
 6 function TrimBBSText(aBBSStr: String): String;
 7 var
 8   tmpStr, tmpSub: String;
 9   iCharPos: Integer;
10 begin
11   iCharPos := 1;
12   // 从tmpStr的第一个字符到最后一个
13   while (iCharPos <= Length(tmpStr)) do
14   begin
15     case tmpStr[iCharPos] of  // 检查当前字符
16 
17       '<':   {-HTML标记处理-}
18         begin
19           // 取标签内容
20           tmpSub := HTML标签内容;
21 
22           if ( 是<BR> ) then
23           begin
24             Result := Result + #13#10;    // 换成换行符 CRLF = #13#10
25             Continue;
26           end;
27 
28           // 第一种隐藏方式,SPAN标签加 DISPLAY: none
29           if ( 是<SPAN style="DISPLAY: none"> ) then
30           begin
31             // 跳过直到SPAN标签结束
32             Continue;
33           end;
34 
35           // 第一种隐藏方式,字体大小 font-size: 0px;
36           if ( 是<FONT style="font-size: 0px; "> ) then
37           begin
38             // 跳过直到FONT标签结束
39             Continue;
40           end;
41 
42           // 其他标签处理
43           Continue;
44         end;
45 
46       '&':   {-转义字符处理-}
47         begin
48           tmpSub := 取转义字符内容;
49           // &nbsp; - 空格
50           if (tmpSub = '&nbsp;') then
51           begin
52             Result := Result + ' ';
53             Continue;
54           end;
55 
56           // 在这里处理其他标记,否则直接贴上转义字符
57           Result := Result + tmpSub;
58         end;
59 
60       else
61         begin
62           // 其他字符不处理
63           Result := Result + tmpStr[iCharPos];
64         end;
65     end;
66     Inc(iCharPos);
67   end;
68 end;

实际上就是自己处理HTML标签,遇到 DISPLAY: none 和 font-size: 0px 的字符就给跳过。这样一来,剩下的就是真实可见部分了。另外要注意的是,HTML中有可能存在转义字符(最常见的是&nbsp;),处理方法见代码46行。

另外,还可以用IHTMLDocument3接口去处理HTML标记并获取内容,只不过那个方法处理起来比这个循环还麻烦,以后有机会再演示一下。

代码中只处理了 SPAN标签DISPLAY: none 和 FONT标签font-size: 0px 两种情况,如果要想程序通用,还需在代码中加入更多对不可见字符的识别。

如何获取选定部分的HTML的更多相关文章

  1. jeecg中datagrid中获取选定行的字段值

    datagrid代码如下: <t:datagrid name="orderMainList" checkbox="true" pagination=&qu ...

  2. 使用 JavaScript 在下拉列表中获取选定的值

    使用 JavaScript 在下拉列表中获取选定的值 演示Demo 使用 JavaScript 在下拉列表中获取选定的值? <!DOCTYPE html> <html> < ...

  3. easyui时间控件用js实时获取选定的时间的取法

    easyui时间控件用js实时获取选定的时间的取法var   datetime=$("#id").datetimebox("getValue");不能用 $(& ...

  4. bootstrp的datetimepicker插件获取选定日期

    碰到一个日期选择,并将日期存储到数据库的需求,需要利用bootstrp的datetimepicker插件获取选定日期,并将其转换为指定字符窜,简单记录下实现的过程. 1. datetimepicker ...

  5. ArcGIS Add-in开发(一)--获取选定要素的属性值

    刚刚接触AE开发,记录一下自己的学习心得! 欢迎大家一起交流探讨! 最近做大赛,突然想到可以让项目更加直观的操作,就在项目中加了幅底图(底图很简单) 我想在arcmap中选中相应的要素后,在后台通过写 ...

  6. dialogs打开对话框选定文件夹,getopenfilename获取文件名

    如果需要使用“打开”.“打印”等Excel内置对话框已经具有的功能,可以使用代码直接调用这些内置的对话框,如下面的代码所示. #001  Sub DialogOpen() #002      Appl ...

  7. js获取gridview模板列中textbox行列的值

    下面一个例子:在gridview中第一列输入数值,第二列输入数值,点击第三列的时候进行计算 求和,如果不符合标记为红色字体. 如图: 代码 : <html xmlns="http:// ...

  8. Winfrom 中 ComboBox 绑定数据后设置选定项问题

    在为 ComboBox 当定数据的时候,如果遇到界面显示需要用文本,而获取选定项的值时需要用数字,我们就很习惯使用 DataSource  来进行绑定. 例如以下代码: List<TextVal ...

  9. listBox获取项的方法

    获取所有项 ; i < LB.Items.Count;i++ )2 {3 str_arr.Add(LB.Items[i].ToString()); 4 } 获取指定项 string str=LB ...

随机推荐

  1. 逃离迷宫(BFS)题解

    Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...

  2. 【打分策略】Elasticsearch打分策略详解与explain手把手计算

    一.目的 一个搜索引擎使用的时候必定需要排序这个模块,一般情况下在不选择按照某一字段排序的情况下,都是按照打分的高低进行一个默认排序的,所以如果正式使用的话,必须对默认排序的打分策略有一个详细的了解才 ...

  3. Spring security框架原理

    转自: http://www.blogjava.net/youxia/archive/2008/12/07/244883.html  在SpringSide 3的官方文档中,说安全框架使用的是Spri ...

  4. catalina.home与 catalina.base区别

    转载请注明出处: 以Tomcat6.0为例,其Tomcat目 录结构如下: bin (运行脚本) conf (配置文件) lib (核心库文件) logs (日志目录) temp (临时目录) web ...

  5. 【旧版本】Ubuntu 14.04 下 P416编译器 p4c的安装

    注:此为2017年5月份的安装方法,最新的p4c安装方法见: Ubuntu14.04下 安装p4c 参考: p4c README Ubuntu 14.04 下 P4v16编译器 p4c的安装 系统要求 ...

  6. 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...

  7. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

  8. hdu 1788 最小公倍数(这题面。。。)

    Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?

    为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是? template <class T, class D = default_delete&l ...

  10. Spring AOP之使用注解创建切面

    上节中我们已经定义了Performance接口,他是切面中的切点的一个目标对象.那么现在就让我们使用AspectJ注解来定义切面吧. 1.定义切面 下面我们就来定义一场舞台剧中观众的切面类Audien ...