一个字符串处理问题,感觉有点难度

不停歇的步伐 2009-11-02 04:12:33
 现有个html文件,里面大概内容如下:
<html>
<body>
<table>
......
</table>
<object>
classid="11111111-1111-1111-1111-111111111111" id=object
</object>
<object>
classid="22222222-2222-2222-2222-222222222222" id=object
</object>
<object>
classid="33333333-3333-3333-3333-333333333333" id=object
</object>
<body>
</html>

要求把classid="11111111-1111-1111-1111-111111111111"的Object从文件中去掉,结果如下:
<html>
<body>
<table>
......
</table>
<object>
classid="22222222-2222-2222-2222-222222222222" id=object
</object>
<object>
classid="33333333-3333-3333-3333-333333333333" id=object
</object>
<body>
</html>
[/code]
请大家帮忙看看有什么办法可以解决
...全文
94 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gwhdaxia 2009-11-03
  • 打赏
  • 举报
回复

还好吧,就是麻烦点,没多难
不停歇的步伐 2009-11-03
  • 打赏
  • 举报
回复
有更好的办法欢迎跟贴,感谢大家的帮忙
不停歇的步伐 2009-11-03
  • 打赏
  • 举报
回复

通过拆分字符串方式已经实现了,现把代码贴出来
function TForm2.DeleteStr(S, DelStr: string): string;
var
PreHtml, PreReserveHtml, NextHtml: string;
iPos: Integer;
begin
iPos := Pos(DelStr, s);
while iPos > 0 do
begin
//取前段
PreHtml := Copy(s, 1, ipos - 1);
//取后段
NextHtml := Copy(s, iPos, Length(s));
//反转字符串
PreReserveHtml := StrUtils.ReverseString(PreHtml);
Delete(PreReserveHtml, 1, Pos('tcejbo<', PreReserveHtml) + 6);
PreHtml := ReverseString(PreReserveHtml);
Delete(NextHtml, 1, Pos('</object>', NextHtml) + 8);
s := PreHtml + NextHtml;
iPos := Pos(DelStr, s);
end;
Result := s;
end;
haitao 2009-11-02
  • 打赏
  • 举报
回复
我自己实现过一个函数 gettag(s,sbegin,send:string;var b,e:int):boolean
从s里查找sbegin,如果没有找到就返回false,否则再在此位置开始找send,如果没有找到就返回false
否则就返回sbegin、send的位置

s:=html;
sout:='';
while gettag(s,'<object>','</object>', b,e) do
begin
sub:=copy(s,b,e-b+1);
if pos(sub,'1111111...')<1 then
sout:=sout+copy(s,1,e+8)
else
sout:=sout+copy(s,1,b-1);
delete(s,1,e+8);
end;

贝隆 2009-11-02
  • 打赏
  • 举报
回复
yshuui 2009-11-02
  • 打赏
  • 举报
回复
正则表达式可以,不过得学一下。超级通配。
Frank.WU 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zyyjc 的回复:]
节点很多啊,用循环和递归都太慢了
[/Quote]

如果用循环说慢就没办法了,用正则式更慢。
不停歇的步伐 2009-11-02
  • 打赏
  • 举报
回复
节点很多啊,用循环和递归都太慢了
icerainy 2009-11-02
  • 打赏
  • 举报
回复
上面写错了 应该这样写
当 if node.NodeName= 'object' then
begin
//进行上面处理
end;
下班了,有问题晚上再看
icerainy 2009-11-02
  • 打赏
  • 举报
回复
那你循环啊!
遍历一遍所有节点就行了!
大学时学过深度或者广度遍历,写一个就行了 ,
当 if node.NodeName= object then
begin
//进行上面处理
end;
遍历算法 就是一递归 或者循环
不停歇的步伐 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 icerainy 的回复:]
......
[/Quote]

用DOM的方式我也想过,不过由于节点不确定,有可能在<body>节点,<table>节点,<td>节点,也有可能在其他节点,所以实现起来比较复杂的(抱歉我的问题没有表示清楚)
icerainy 2009-11-02
  • 打赏
  • 举报
回复
时间有限,做了个简单例子,条件控制自己加上,准备接分
procedure TForm1.Button2Click(Sender: TObject);
var
XMLDoc : IXMLDocument ;
node,object_node,del_node,par_node : IXMLNode;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.Active := True;
XMLDoc.LoadFromFile('test.html');//你的存储文件名
node := XMLDoc.ChildNodes.FindNode('html');
node := node.ChildNodes.FindNode('body');
object_node := node.ChildNodes.FindNode('object');
while object_node<>nil do
begin
if Pos('11111111-1111',object_node.Text)>0 then
begin
del_node := object_node ;
object_node := object_node.NextSibling;
node.ChildNodes.Remove(del_node) ;
end
else
object_node := object_node.NextSibling;

end;
XMLDoc.SaveToFile('test.html');
end;
不停歇的步伐 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hydonlee 的回复:]
貌似用正则比较好.


[/Quote]

用正则如何实现?
不停歇的步伐 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bdmh 的回复:]
分成多行,那你怎么知道它是要删除的那行数据呢
[/Quote]

就是删除classid为"11111111-1111-1111-1111-111111111111"的<object>到</object>之间的字符,跟行数不应该有什么逻辑关系的

不知道我这样说是否清楚
hydonlee 2009-11-02
  • 打赏
  • 举报
回复
貌似用正则比较好.

bdmh 2009-11-02
  • 打赏
  • 举报
回复
分成多行,那你怎么知道它是要删除的那行数据呢
不停歇的步伐 2009-11-02
  • 打赏
  • 举报
回复
不一定是一行,有可以分成了多行的情况
bdmh 2009-11-02
  • 打赏
  • 举报
回复
读到memo中,然后循环lines,找到符合条件的那一行删除之,然后在保存成文件
gyk120 2009-11-02
  • 打赏
  • 举报
回复
字符串比较,比较111111111……然后删除

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧