1.效果图:

我有一个wordpress博客,每次在csdn上写完博客,都需要复制到wordpress中,还需要手动修改<pre>和图片地址,比较麻烦,所以做了这个工具。

功能:

1.把CSDN博客的文章中的<pre name="code" class="cpp">标签转换成自定义的标签。比如我的wordpress博客中用的代码加亮插件是SyntaxHighlighter他的代码标签是<pre class="brush:cpp;" >

2.把CSDN博客的文章中的图片标签转换成Wordpress博客中的图片地址。比如会把"http://img.blog.csdn.net/20130621230257406"转换成"http://www.waitingfy/wp-content/uploads/2013/07/20130621230257406.jpg"

2. boost xpressive

本文假定读者已经下载了boost,并且编译了boost。

首先看第一个需求,把<pre name="code" class="cpp">转换成<pre class="brush:cpp;" >。

这个项目难的是正则表达式的写法,倒不是xpressive中sregex,regex_replace,sregex_iterator的应用。

首先要通过正则表达式得到cpp。

我写的正则表达式是  (?:<pre name=\"code\" class=\")(.*?)(?:\">)

解释下这个正则表达式的作用。

首先是3对小括号,会匹配四个组: <pre name="code" class="cpp">

<pre name="code" class="

cpp

">。

再看下?的作用,(后面跟?:是表示不将这个匹配结果加入到组中.

这样就只剩下两个组了。<pre name="code" class="cpp">和cpp。用(*pos)[1]就能得到我们要的cpp了。

.*?这个也很关键,允许我复制一段文字解释下。

贪婪匹配

在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

string pattern1 = @"a.*c";   // greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"

非贪婪匹配

在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"

把<pre name="code" class="cpp">转换成<pre class="brush:cpp;" >完整代码:

看不懂的还是看下《Boost程序库完全开发指南》206页关于sregex_iterator的说明。

string replaceCodeString(string& inString, const string& customedPreString){
sregex reg = sregex::compile("(?:<pre name=\"code\" class=\")(.*?)(?:\">)");
sregex_iterator pos(inString.begin(),inString.end(),reg);
sregex_iterator end;
string copyStr = inString;
sregex replaceCodeRegex;
while(pos != end){
string language = (*pos)[1];
replaceCodeRegex = sregex::compile("<pre name=\"code\" class=\"" + language + "\">" ,icase);
char customedPre[100];
sprintf_s(customedPre,customedPreString.c_str(),language.c_str());
copyStr = regex_replace(copyStr,replaceCodeRegex,customedPre);
++pos;
}
return copyStr;
}

转换图片也是类似的代码:

string replaceImgString(string& inString, const string& domain){

	//first add ".jpg"
sregex addJpgRegex = sregex::compile("\" alt=\"\" />");
inString = regex_replace(inString, addJpgRegex, ".jpg\" alt=\"\" />"); //second replace "img.blog.csdn.net" to "www.waitingfy.com/wp-content/uploads/2013/07"
sregex urlRegex = sregex::compile("img.blog.csdn.net");
time_t now; time(&now);
char s[100];
struct tm *ttime = localtime(&now);
sprintf_s(s,"%s/wp-content/uploads/%02d/%02d",domain.c_str(),ttime->tm_year + 1900,ttime->tm_mon + 1);
inString = regex_replace(inString,urlRegex,s); //third replace "?watermark......" to ".jpg"
string copyStr = inString;
sregex findWatermarkRegex = sregex::compile("(\\?watermark.*?)(?:\" alt=\"\" />)");
sregex_iterator pos(inString.begin(),inString.end(),findWatermarkRegex);
sregex_iterator end;
sregex replaceToJpgRegex;
while(pos != end){
replaceToJpgRegex = sregex::compile("\\" + (*pos)[1],icase);
copyStr = regex_replace(copyStr,replaceToJpgRegex,".jpg");
++pos;
}
return copyStr;
}

你们还是下载整个项目看下吧。是用vs2005写的。

项目下载地址:http://www.waitingfy.com/?attachment_id=604

文章源地址:http://www.waitingfy.com/?p=592

boost xpressive 例子的更多相关文章

  1. 学习懈怠的时候,可以运行Qt自带的Demo,或者Delphi控件自带的Demo,或者Cantu书带的源码,运行一下Boost的例子(搞C++不学习Boost/Poco/Folly绝对是一大损失,有需要使用库要第一时间想到)(在六大的痛苦经历说明,我的理论性确实不强,更适合做实践)

    这样学还不用动脑子,而且熟悉控件也需要时间,而且慢慢就找到感觉了,就可以精神抖擞的恢复斗志干活了.或者Cantu书带的源码. 并且可以使用Mac SSD运行Qt的Demo,这样运行速度快一点. 此外, ...

  2. boost - 正则表达式xpressive

     正则表达式是一套处理文本强有力的工具: 它使用一套复杂的语法规则,可以解决文本处理领域的绝大多数问题; 而这些问题通常是字符串算法很难甚至无法解决的. C++98标准中没有内置的正则表达式支持,使得 ...

  3. (九)boost库之文件处理filesystem

    (九)boost库之文件处理filesystem   filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能 ...

  4. Boost filessystem...

    CMakeList.txt: cmake_minimum_required(VERSION 3.8) project(Demo) ) set(SOURCE_FILES main.cpp) //需要添加 ...

  5. windows下编译和安装boost库

    boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...

  6. boost shared_ptr weak_ptr

    文档: http://www.boost.org/doc/libs/1_57_0/libs/smart_ptr/shared_ptr.htm shared_ptr构造有个原型 template< ...

  7. boost之正则表达式

    正则表示主要用于查找一系列符合规则的对象,而我们之前的查找是对某一特定的字符串进行查找. #include <iostream> #include <vector> #incl ...

  8. boost regex expression

    Boost.Regex provides three different functions to search for regular expressions 1. regex_match #inc ...

  9. c++ shared_ptr 使用注意事项. 1

    条款1:不要把一个原生指针给多个shared_ptr管理 int* ptr = new int; shared_ptr<int> p1(ptr); shared_ptr<int> ...

随机推荐

  1. Linux内核源代码情景分析-中断半

    一.中断初始化 1.中断向量表IDT初始化 void __init init_IRQ(void) { int i; #ifndef CONFIG_X86_VISWS_APIC init_ISA_irq ...

  2. Self referencing loop detected with type

    json.net namespace EFDAL{    using System;    using System.Collections.Generic;    using Newtonsoft. ...

  3. git上自然框架源码

    [自然框架]终于把源码弄到git上吗了 2015-02-02 14:38 by 金色海洋(jyk)阳光男孩, 183 阅读, 6 评论, 收藏, 编辑 好久没写博客了,发现又从左面的排名里掉出去了. ...

  4. javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式

    原文:javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式 ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13 ...

  5. C#中调用Outlook API 发起会议

    原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...

  6. Linux下查看使用频率最高的十个命令

    这个shell是在linux吧一个小伙伴发的,链接已找不到,挺有意思的,隔段时间运行一次,可以看看自己最近都干了什么. [shell] history | awk '{CMD[$2]++;count+ ...

  7. Spring Resource之内置的Resource实现

    Spring提供了大量的并且可以直接使用的Resource实现 1.UrlResource UrlResource封装了一个java.net.URL,而且可以通过一个URL用于访问任何对象,例如文件. ...

  8. C语言字符串操作函数集

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  9. python进程池剖析(三)

    之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...

  10. 藏地传奇js

    http://zd.163.com/m/zhenyan/ js很厉害,有很多值得学习的地方,记录下来. http://res.nie.netease.com/zdcq/qt/13/0625_zheny ...