跨出挑战正则表达式的第一步
在 WordPress 混了一年有余,现在对 DIV+CSS 这类基础知识已经比较熟悉了,像 PHP 这样高深的编程语言我也只是在 WordPress 的基础上窥得一二。只有当自己深入去学习 PHP,并尝试写代码时,才会对“代码如诗”这句话有所体会,不过现在的我只能大致读懂 PHP 这首“诗”,偶尔也可以写出几首烂“诗”来自娱自乐。在学习 PHP 的过程中一直有个瓶颈我不愿也不敢跨过,那就是正则表达式,那一串串又像密码又似乱码的字符串让我望而却步。终有一天,我揭开了 PHP 正则表达式的神秘面纱,原来也不过如此,看了三个小时的视频资料,我就基本了解也能看懂正则表达式了,还写了一些玩玩,这些纯属经验之谈。
首页要正视正则表达式,不要被它吓到了,一开始我就是被正则表达式的奇怪排列和看似无规律的组合给吓着了,以至于我一直不敢对正则表达式轻举妄动,可没想到这把我吓的不轻的正则表达式仅仅半个下午被可以拿下了。我个人认为,要学会正则表达式,你需要的不是时间,而是信心和勇气。下面是我学习的一些材料,希望对欲学又止的朋友们可以有点帮助。
两个 PHP 正则表达式的视频资料(上集、下集)。我看下来感觉还不错,是老师现场教学的,在过程中老师面对正则有时候也不免犯一些错误,这些都没有被切掉,不过我觉得这很好,那些都是很容易犯的错误,正好可以作个反面教材着重学习一下。看完上下两集,基本就可以玩玩正则表达式了,根据视频里老师布置的一个课后作业,要求用正则表达示获取某个天气预报网站的天气预报信息。作为我处女作的正则表达式练习,我也就做了一个 作业练习,天气预报的信息来自于中央气象台网站,调用的是该网站上最近四天的天气预报。做的比较简单,也没有经过美化,不过我想如果加加图片美化一下可以做成一个不错的 WordPress 插件,呵呵,应该有前辈已经做过了吧,我就不再掺合了,仅是一个发散的学以至用的思路。
另外附上一张正则表达式的符号解释表,作为自己的备忘,有兴趣的朋友也可以看看。
| 字符 | 描述 |
| \ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 |
| ^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
| $ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
| * | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
| + | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
| ? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 |
| {n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
| {n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
| {n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
| ? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
| . | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
| (pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 |
| (?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 |
| (?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
| (?!pattern) | 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
| x|y | 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
| [xyz] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
| [^xyz] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 |
| [a-z] | 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 |
| [^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
| \B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
| \cx | 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
| \d | 匹配一个数字字符。等价于 [0-9]。 |
| \D | 匹配一个非数字字符。等价于 [^0-9]。 |
| \f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
| \n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
| \r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
| \S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
| \t | 匹配一个制表符。等价于 \x09 和 \cI。 |
| \v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
| \w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
| \W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
| \xn | 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。. |
| \num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 |
| \n | 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 |
| \nm | 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 |
| \nml | 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 |
| \un | 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。 |
-
PHP 实现的静态世界时钟功能2010年07月9日 -
Wordpress 显示随机广告的方法2010年05月13日 -
PHP 学习笔记:echo 输出2009年09月12日 -
《PHP从入门到精通》视频教程2009年09月11日
看的有些眼熟,学几年编程,终于找到相通点了。有空掰掰~
终结的很好啊``非常的哈啊```
班里正则女王,现在正在ucweb做开发~~她主攻编程语言的语法,所以编译一般牛。。正则随便写个引擎就ok了
如此之牛,羡慕啊
“像 PHP 这样高深的编程语言”哈哈哈
学习了。谢谢分享
我英语不好 幸好有中文的 呵呵!
老万开始学正则表达式啦~~~我也学习学习,对这个东西比较打怵
大学几年真实白学了,没看懂
留着以后可以查询看看··
正则我学了一点点够用,但是不精通 呵呵
博主的人气很猛啊,以后常来光临
fuck regular expressions,
不过作用确实很强大 301,302经常要用到
表中的正则还是比较简单的,只是我经常记不住
吼吼吼,万戈要开始强力起来了 ~ 围观中 ~
这两天换主题比较勤呀····
点击评论人名称,得到一个一个类似http://wange.im/?r=http://www.baidu.com的链接,但是发现在在chrome下点击了,还是回到万戈,其他地方没测试呢~
技术文不被给力啊,过来灌一下水提升下人气
这篇文章我是彻底的晕菜了……
很有必要学习一下,看来万兄真是强悍呀。
正则这东西不是一般人能搞的
我来灌水的,万戈博客的人真多,写篇日志介绍介绍经验呗?
我目前还是没有时间去研究这些。以后空下来是应该好好充充电了。
很好很强大!
正则好啊。我学了好久,还是皮毛
正则表达式 在学习编程的时候,也没怎么去学,老师总说没有应用的很少,所以一直都不怎么了解。
万戈同学每天都在进步。话说,万戈在做什么工作啊?
老师。
jQuery里用正则超级无敌~
万格格的家悲剧了,大家庆祝一下。。
开始升级3.01了?看到默认主题了。
很不错,我自己也有用了快一年 但是了解皮毛而已
来啦,文章不错,喜欢
再详细点...顶个。。
javascirpt的正则表达式才是老得经典
我汗啊。。怎么成了默认主题了,万哥
额 这个似乎是默认主题了 在调试吗?
哇擦?这是传说中的默认主题么..
对这个很有兴趣,我也要学习下
日了 沙发又没抢到
用的少,记不住。都做成手册,随用随查。
看来正则真的很管用呀。 我那个问题你用正则一下就解决了
技术牛人永不止步
开始搞PHP?
万兄,出来工作之后发现没有时间学东西,你是怎么安排你的时间的?
时间就像**,挤一下总是会有的,我极限地压限了我的睡眠时间用来折腾我所爱的兴趣
好迅猛
跟着万戈一起学~~
我跟着大师学~
我也要学,不然做啥都不给力啊
原来你不会呀
我跟你技术差不多
一样菜
举手——!!!正则表达式是啥?
正则表达式就是。。。。google之~
不知道為啥,我看到那長長的表格就頭暈了
好吧,我要克服自己的膽怯!
我一个下午可以拿下这张表格的一半,一点不难
一下午就一半?果真是大神,大概是我的基礎沒打好,然後最近又少看code,所以之前吸收的又吐回去了
反正之後我會趁工餘時間多看、多學、多練習實作的,也要謝謝萬戈分享你的學習資源喔
应该是差不多吧两者
还视频。。。我去瞧瞧 有没有我犀利
啥时候传授我两招呀大侠
一直怕怕,有空再看,或者是需要时,一个字:懒
你头像咋没了捏?
被我缓存了吧?
话说感觉这几天Gravatar的速度还是挺快的。
完全不懂呀
不难,看两小时就明白了
正巧我昨天刚写了一篇文章,里面提到了正则表达式,并配有众多示例: 表单大写字母自动转小写 解决Z-Bolg大写邮箱地址无头像问题
强大的正则~~用熟了将会非常牛逼~
我只会用正则写输入内容判断……
感觉这样就很厉害了
哇,前排!
这东西研究不了 我还是继续做我的 Favicon 去吧...
承认慢了
不给力啊~
很给力了
最近还忙不?等你养精蓄锐 在来做做美化~
呃。。。刚接到一个收费主题,等你设计好,我就来帮你搞定
好的 就是没换一下评论 先依客户 不急 不急
正则威武。。已经拿下。
正则大仙光临