php代码高亮正则,几个小例子教你如何实现正则表达式highlight高亮

程序员在编写代码的时候少不了和字符串以及“查询”打交道,两者的交集中有一个叫做正则表达式的的东西,这家伙用好了可以提高编程效率,用不好的话...你可以先去好好学一学。

关于正则的使用,举个简单的例子:

var m = location.href.match(/(\w+:)\/{0,3}([^\/]+)(?:(\/[^\?#]*))?(?:(\?[^#]+|.+))?(?:(#.*))?/);

var res = {

protocol: m[1],

host: m[2],

path: m[3],

search: m[4],

hash: m[5]

};

console.log(res);

憋了几分钟= =||,我也觉得这个正则不是特别好理解(红黑相间了,应该稍微清晰点),有些朋友可能不知道(?:content)是什么意思,还有类似(?!content)和(?=content)分组和前瞻的知识,建议去问问度哥和谷娘。

一. 正则应用小DEMO示例

下面是一串随手写的代码,放在textarea中:

/**

* @author barret lee

* @date   2013-10-06

* @email  barret.china@gmail.com

*/

//outer var

var a = "this id outer string";

//closure

function b() {

//inner var

var a = "this is inner string";

var g = a.replace(/this is inner string/g, function() {

return new Function("/*clousure*/this.a")();

});

/**

* @description closure - regExp test

* @author barret lee

*/

function c() {

return {

a: a,

g: g

}

}

return c;

}

var s = b()(); //s.a, s.g

正则匹配,处理上面那堆字符串的小DEMO:

/**

* @author barret lee

* @date 2013-10-06

* @email barret.china@gmail.com

*/

//outer var

var a = "this id outer string";

//closure

function b() {

//inner var

var a = "this is inner string";

var g = a.replace(/this is inner string/g, function() {

return new Function("/*clousure*/this.a")();

});

/**

* @description closure - regExp test

* @author barret lee

*/

function c() {

return {

a: a,

g: g

}

}

return c;

}

var s = b()(); //s.a, s.g

跟着提示,下一步下一步多点几下,可以看出效果还是可以滴。主要是这里的正则略微的麻烦,处理一个色变得琢磨老半天。

P.S:上面这玩意儿只是一个小测试,代码相当不健壮,拿着学习正则练手~

二. 需要注意的地方

//step config

var config = {

regs: [

/^\s+|\s+$/g,

/(["'])(?:\\.|[^\\\n])*?\1/g,

/\/(?!\*|span).+\/(?!span)[gim]*/g,

/(\/\/.*|\/\*[\S\s]+?\*\/)/g,

/(\*\s*)(@\w+)(?=\s*)/g,

/\b...\b/g

],

//...

};

这些正则我是分开来写的,主要是为了做上面那个demo,方便单步显示。但是把这些正则分开写是相当不合理的,放在textarea中的是一串没有任何标签的字符串,为了着色,每处理一个正则都会在codes中插入一些标签(我这里用的是span),当我们处理下一个正则的时候就必须得考虑上一步加入的标签,这样会很大程度提高开发难度,最好的做法是把这些正则都放到一坨,然后用|隔开:

var reg = (/^\s+|\s+$/)|(/(["'])(?:\\.|[^\\\n])*?\1/)|(/\/(?!\*|span).+\/(?!span)[gim]*/)|(/(\/\/.*|\/\*[\S\s]+?\*\/)/)|(/(\*\s*)(@\w+)(?=\s*)/)|(/\b(break|continue|do|for|in|function|if|else|return|switch|throw|try|catch|finally|var|while|with|case|new|typeof|instance|delete|void|Object|Array|String|Number|Boolean|Function|RegExp|Date|Math|window|document|navigator|location|true|false|null|undefined|NaN)\b)

这样放的好处是可以直接

codes.replace(reg, function(){

var args = arguments;

//...

});

一次性处理,不用担心插入标签影响最后的结果,因为标签是同一时间插入的,不会有干扰。

代码高亮插件highlight的基本原理也差不多,只不过他的容错机制和代码健壮性这块做的更加完善,我在代码里头加了一个配置文件,

var colors = {

string: "#FFA0A0",

reg: "#16E916",

note: "#888",

tag: "orange",

keywords: "#B0B0FF"

};

按照自己的喜好,也可以加以修改,类似这样的扩展,我们在写代码的时候稍微注意下,多留几个接口就好了。(不过这些活儿干起来都还挺辛苦的~)

没有做成插件,也没这个必要,知道基本原理然后动手实践下就差不多了。

三. 小结

类似很多的前端模板,artTemplate,baiduTemplate等都是对正则表达式的绝伦应用,很值得去看看源码,好好钻研人家都考虑了那些容易出错的点,源码都不长,两三百行。了解一个大概比较容易,但是当自己动手的时候总会发现很多细节问题处理不好,我那上面几个正则就倒弄了半天= =

正则表达式,用起来还是挺方便的。正则技能,你值得拥有~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写在前面 用WordPress以来,一直是用CodeColorer来实现代码高亮,但原版的汉化不够完全,且与不少主题都冲突,因此本人将原版修改过后使用,并加入了可视化代码插入功能,之前也想发布出来,但因为懒,一直推迟到现在,既然大家希望我提供下载,因此我把它打包出来提供给大家。 CodeColorer CodeColorer是一款基于GeSHi库的WordPress代码语法高亮插件。功能简单,使用方便,是一款比较轻量的插件。CodeColorer支持[ccei_html][cc lang="lang"]code[/cc][/ccei_html] 和[ccei_html]<code lang="lang">code</code>[/ccei_html]两种语法。 属性说明 属性列表如下,括号内是参数类型.string是字符串;integer是整数;boolean是布尔型(开关),可接受“true” “false”, “on” “off”, 整数 1 or 0. lang (string) – 代码使用的语言。 tab_size (integer) – 用以替换制表符的空格数,可在设置界面更改。 line_numbers (boolean) – 是否显示行号,可在设置界面更改。 first_line (integer) – 指定代码块第一行的行号 highlight (string) – 用于指定整行高亮代码行行数,参数是用半角逗号分隔的数字串(如 1,5,8,9)。 no_links (boolean) – 当值为false时,关键字将会添加一个到官方文档的链接,可在设置界面更改。 lines (integer) –指定代码块显示的行数,当值设置为-1时,不出现纵向滚动条,可在设置界面更改。 width (integer or string) – 代码块宽度,可在设置界面更改。 height (integer or string) – 代码块高度,当这个高度可显示的行数比lines指定的值大才会生效,可在设置界面更改。 rss_width (integer or string) – 代码块在RSS输出时的宽度,可在设置界面更改。 theme (string) – 代码块颜色风格 (default, blackboard, dawn, mac-classic, twitlight, vibrant),可在设置界面更改。 inline (boolean) – 内嵌模式开关,用于将一行代码插入到文本中。 strict (boolean) – 严格模式的开关。 nowrap (boolean) – 当值指定为false时,过长的行将会被自动换行,以避免出现横向滚动条。 noborder (boolean) – 是否显示边框的开关。 no_cc (boolean) – 当值为true时,code标签将会被解析,但代码块不会有格式。 class (string) – 添加一个新的CSS。 escaped (string) – 当值为false,代码块里的html转义字符不会被转义,如<不会转义为<,默认为false。 我的博客: http://lanfei.sinaapp.com/ http://blog.csdn.net/CooLanfei 欢迎访问交流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值