其实这个程序很简单,首先是如何获取选定部分的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. Linux驱动模块的Makefile分析【转】

    本文转载自:http://blog.chinaunix.net/uid-29307109-id-3993784.html 1. 获取内核版本 当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块 ...

  2. linux性能分析工具之火焰图

    一.环境 1.1 jello@jello:~$ uname -a Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UT ...

  3. linux下设置软件使用socks5代理

    1.为wget使用代理,可以直接修改/etc/wgetrc,也可以在主文件夹下新建.wgetrc,并编辑相应内容,本文采用后者. 直接往~/.wgetrc(自行创建此文件)添加如下内容: https_ ...

  4. P3466 [POI2008]KLO-Building blocks

    目录 题目 思路 错误 代码 题目 luogu csdn好像限制了展开博客次数,真的好xx 思路 显然一段区间内的值一定是他的中位数 少一点比多一点好 然后就可以枚举区间了 区间答案为 val[mid ...

  5. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法

    项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Pat ...

  6. ThreadPoolExecutor执行过程分析

    ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTi ...

  7. [转]python新手必碰到的问题---encode与decode,中文乱码--转载

    edu.codepub.com/2009/1029/17037.php 这个问题在python3.0里已经解决了. 这有篇很好的文章,可以明白这个问题: 为什么会报错“UnicodeEncodeErr ...

  8. win7(64)未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序

    注:本文为个人学习摘录,原文地址:http://blog.163.com/rihui_7/blog/static/2122851432013627103337825/ 1.以前在win7 64位系统上 ...

  9. [ios]ScrollView小结

    设置ScrollView self.mysrollview.contentSize = CGSizeMake(1024,768); self.mysrollview.pagingEnabled = Y ...

  10. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...