曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3223|回复: 0
打印 上一主题 下一主题

过滤 bbs code 标签

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-7-15 20:04:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当使用论坛的所见即所得模式转帖某些网站的帖子时,往往会带有许多外链,比如下图所示的:

如上红色下划线所示。

如果考虑用 grep 和 sed 过滤,应该是有些困难的。因为 sed 主要是针对行过滤的,如果一个行里包含了许多要替换的元素,那么就有些麻烦了;而 grep 可以按照正则提取,但是替换却又不是他主要关心的。

用 perl 则很轻松的实现这个功能,如下代码所示可以过滤掉上面的 url 标签,但保留标签中的内容,比如“键盘”和 img 标签中的内容:
[code=perl]#!/usr/bin/perl

        $file = "pcpop.txt";
        open (TEMP, "<pcpop.txt") or die "Can't open $file:$!\n";

         while (<TEMP>) {
                 s/\[url=(.*?)\.html\](.*?)\[\/url\]/\2/g;
                 print;
        }
        
        close TEMP;[/mw_shl_code]

在上面的代码中,pcpop.txt 保存了要过滤的帖子内容。open() 函数建立一个打开 pcpop.txt 文件的句柄,'<' 符号表示以读取方式打开文件。代码中关键就是 while 里面的正则,该正则是比较容易理解的,即去掉 url 左右两标签,而保留被添加标签的内容,正则中的 g 和 sed 里的一样,表示全局替换。

更方面的是,可以用 perl 命令直接执行下面的语句:
/usr/bin/perl -p -i -e "s/\[url=(.*?)\.html\](.*?)\[\/url\]/\2/g;" pcpop.txt

在上面命令中,
-e 选项表示后接命令,如上面的正则表达式。
-i  选项和 sed 中的 -i 意思类似,表示将作用结果直接写入文件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-5 21:57 , Processed in 0.105254 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表