免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4369 | 回复: 11
打印 上一主题 下一主题

[C++] 过滤字符串里面标签 如: <html></html> 函数怎么写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-22 14:08 |只看该作者 |倒序浏览
本帖最后由 huojiaan1234 于 2011-04-22 14:15 编辑

求大家帮帮忙想想 如标题的问题 但是不止这种标签 是各种的 写一个通用的 如<html>帮帮我</html>  我要取里面字符串的 帮帮我

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2011-04-22 14:45 |只看该作者
求大家帮帮忙想想 如标题的问题 但是不止这种标签 是各种的 写一个通用的 如帮帮我  我要取里面字符串的 帮 ...
huojiaan1234 发表于 2011-04-22 14:08



正则表达式

论坛徽章:
0
3 [报告]
发表于 2011-04-22 14:47 |只看该作者
什么叫正则表达式?

论坛徽章:
0
4 [报告]
发表于 2011-04-22 14:49 |只看该作者
能写一下代码给我看一下吗?

论坛徽章:
0
5 [报告]
发表于 2011-04-22 14:49 |只看该作者
如果格式标准的话,试试 xml解析的库
或者用字符匹配吧,比如kmp或者bm算法,搜索到两个节点的地址,然后提取中间部分

论坛徽章:
0
6 [报告]
发表于 2011-04-22 15:54 |只看该作者
不用啦, 用状态机就行了, 当读到"<"时标识为过滤状态, 当读到">"时标识为不过滤状态. 过滤状态把所有读到的数据忽略.

论坛徽章:
0
7 [报告]
发表于 2011-04-22 16:26 |只看该作者
DOM 或 SAX,找libxml2库吧

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2011-04-22 18:11 |只看该作者
接6楼算法

  1. #include <stdio.h>

  2. int filter(FILE *src_fp, FILE *tar_fp)
  3. {
  4.         int in_tag = 0;
  5.         int in_str = 0;
  6.         int cnt = 0;
  7.         int c;

  8.         while ((c = fgetc(src_fp)) != EOF) {
  9.                 if (in_tag) {
  10.                         if (in_str) {
  11.                                 if (c == '"') {
  12.                                         in_str = 0;
  13.                                 }
  14.                         }else {
  15.                                 if (c == '>') {
  16.                                         in_tag = 0;
  17.                                 }else if (c == '"') {
  18.                                         in_str = 1;
  19.                                 }
  20.                         }
  21.                 }else {
  22.                         if (c == '<') {
  23.                                 in_tag = 1;
  24.                         }else {
  25.                                 cnt++;
  26.                                 fputc(c, tar_fp);
  27.                         }
  28.                 }
  29.         }
  30.         return cnt;
  31. }

  32. int main(int argc, const char *argv[])
  33. {
  34.         FILE *fp, *tar_fp;

  35.         if (argc == 2) {
  36.                 fp = fopen(argv[1], "r");
  37.                 if (fp != NULL) {
  38.                         filter(fp, stdout);
  39.                         fclose(fp);
  40.                         return 0;
  41.                 }
  42.         }else if (argc == 3) {
  43.                 fp = fopen(argv[1], "r");
  44.                 if (fp != NULL) {
  45.                         tar_fp = fopen(argv[2], "w");
  46.                         if (tar_fp != NULL) {
  47.                                 filter(fp, tar_fp);
  48.                                 fclose(tar_fp);
  49.                                 fclose(fp);
  50.                                 return 0;
  51.                         }
  52.                         fclose(fp);
  53.                 }
  54.         }else {
  55.                 printf("syntax: filter <source file> [target file]\n");
  56.         }
  57.         return -1;
  58. }
复制代码

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
9 [报告]
发表于 2011-04-22 21:37 |只看该作者
小应用的话还是自己写状态机(DFA)比较好。
其实正则表达式就是状态机实现的。

==========
敬佩8楼,能这样诲人不倦。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
10 [报告]
发表于 2011-04-23 10:49 |只看该作者
加入单双引号匹配.

  1. #include <stdio.h>

  2. int filter(FILE *src_fp, FILE *tar_fp)
  3. {
  4.         int in_tag = 0;
  5.         int in_str = 0;
  6.         int cnt = 0;
  7.         int c;

  8.         while ((c = fgetc(src_fp)) != EOF) {
  9.                 if (in_tag) {
  10.                         if (in_str) {
  11.                                 if (c == in_str) {
  12.                                         in_str = 0;
  13.                                 }
  14.                         }else {
  15.                                 if (c == '>') {
  16.                                         in_tag = 0;
  17.                                 }else if (c == '"' || c == '\'') {
  18.                                         in_str = c;
  19.                                 }
  20.                         }
  21.                 }else {
  22.                         if (c == '<') {
  23.                                 in_tag = 1;
  24.                         }else {
  25.                                 cnt++;
  26.                                 fputc(c, tar_fp);
  27.                         }
  28.                 }
  29.         }
  30.         return cnt;
  31. }

  32. int main(int argc, const char *argv[])
  33. {
  34.         FILE *fp, *tar_fp;

  35.         if (argc == 2) {
  36.                 fp = fopen(argv[1], "r");
  37.                 if (fp != NULL) {
  38.                         filter(fp, stdout);
  39.                         fclose(fp);
  40.                         return 0;
  41.                 }
  42.         }else if (argc == 3) {
  43.                 fp = fopen(argv[1], "r");
  44.                 if (fp != NULL) {
  45.                         tar_fp = fopen(argv[2], "w");
  46.                         if (tar_fp != NULL) {
  47.                                 filter(fp, tar_fp);
  48.                                 fclose(tar_fp);
  49.                                 fclose(fp);
  50.                                 return 0;
  51.                         }
  52.                         fclose(fp);
  53.                 }
  54.         }else {
  55.                 printf("syntax: filter <source file> [target file]\n");
  56.                 return 0;
  57.         }
  58.         return -1;
  59. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP