过滤字符串里面标签 如: <html></html> 函数怎么写

发布于 2022-10-15 08:49:51 字数 170 浏览 28 评论 0

本帖最后由 huojiaan1234 于 2011-04-22 14:15 编辑

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

风筝有风,海豚有海 2022-10-22 08:49:51

求大家帮帮忙想想 如标题的问题 但是不止这种标签 是各种的 写一个通用的 如帮帮我  我要取里面字符串的 帮 ...
huojiaan1234 发表于 2011-04-22 14:08

正则表达式

所谓喜欢 2022-10-22 08:49:51

什么叫正则表达式?

软甜啾 2022-10-22 08:49:51

能写一下代码给我看一下吗?

半枫 2022-10-22 08:49:51

如果格式标准的话,试试 xml解析的库
或者用字符匹配吧,比如kmp或者bm算法,搜索到两个节点的地址,然后提取中间部分

ぺ禁宫浮华殁 2022-10-22 08:49:51

不用啦, 用状态机就行了, 当读到"<"时标识为过滤状态, 当读到">"时标识为不过滤状态. 过滤状态把所有读到的数据忽略.

薄暮涼年 2022-10-22 08:49:51

DOM 或 SAX,找libxml2库吧

我的奇迹 2022-10-22 08:49:51

接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. }

复制代码

晨曦÷微暖 2022-10-22 08:49:51

小应用的话还是自己写状态机(DFA)比较好。
其实正则表达式就是状态机实现的。

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

灵芸 2022-10-22 08:49:51

加入单双引号匹配.

  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. }

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文