进阶级-正则表达式

  • 简述
  • 语法规范
    • 分隔符
    • 模式修饰符
    • 特殊字符
    • 转义序列
  • PHP中的正则函数
    • preg_match
    • preg_replace
    • str_replace
  • 结语

简述

正则表达式(regular expression):描述可能出现在用户提交的文本中的一小段代码,我们通过它,将出现的代码块替换为特殊格式。
正则表达式广泛好用,但入门困难。

语法规范

分隔符

目标代码块被分隔符包围,分隔符一般选用斜杠(/)或井号(#),也可以用除字母、数字和反斜杠之外的任何字符作为分隔符。反斜杠可以转义,转义在基础级文章略有提及,此处不赘述。

模式修饰符

默认情况下,正则表达式区分大小写,不过我们可以通过模式修饰符(pattern modified),使正则忽略大小写。
模式修饰符是一个单个的字符标志,跟在表达式的结束分隔符后。

符号 注释
i 匹配时,不区分大小写

特殊字符

符号- 中文名—- 注释
^ 脱字字符 匹配字符串的开始,自身不包含任何字符,只考虑字符位置
$ 美元符号 匹配字符串的结尾,同上
. 点号 通配符,匹配任何单个字符,除了换行(\n)
* 星号 要求前面的字符出现0或多次,具有贪婪属性1
+ 加号 要求前面的字符出现1或多次,具有贪婪属性
? 问号 匹配前面的子表达式0次或1次,在*+的后面加上一个?就可以实现非贪婪(最小匹配,minimal match)
| 管道符号 正则匹配管道左或右边的模式
(…) 圆括号 标记一个子表达式的开始和结束位置。可对其应用一个修饰符,至于结束括号后即可
[…] 方括号 定义字符类(character class),匹配方括号列出的字符之一。在前方括号后加入^,即可匹配 除去方括号包含的字符

转义序列

(escape sequences)
意义:匹配不太容易输入的一个字符,或匹配某种类型的一个字符。

符号 注释
\n 换行字符
\r 回车字符
\t 制表符
\s 空白字符(whitespace character),等同[\n\r\t]
\S 非空白字符,等同[^\n\r\t]
\d 数字,等同[0-9]
\D 非数字,等同[^0-9]
\w 单词字符,等同[a-zA-Z0-9_]
\W 非单词字符,等同[^a-zA-Z0-9_]
\b 表示单词边界(起始/结束)
\B 表示非单词边界(非起始/结束)

PHP中的正则函数

preg_match:

用来确认一个特定的字符串,是否匹配一个正则表达式。

preg_replace:

接受一个正则表达式和一个文本字符串,并尝试在字符串中匹配该正则表达式。还接受另一个文本字符串,并用该字符串来替换每一次正则匹配。
preg_replace (regExp, replaceWith, OldString [, $limit = -1(无穷) [, int &$count ]] )
例子:

$test = preg_replace('/_([^_]+)_/', '<em>$1</em>');
// 每一个圆括号内,都包含了一个块内容,而块内容的名称按$1、$2……依次递增,在JScript 中则使用 $0…$9 属性。

str_replace:

搜索字符串而非正则表达式模式,类似preg_replace函数,但比之更为高效,对于不区别大小写的简单替换,可以用它来代替。

结语

正则表达式并没有那么容易,但无论如何,既然从事这个职业,既然爱上了编程和编程所涉及的部分方面,我们就应该去尽力做好,将正则写的优雅而易读,这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易被理解
By the way,匹配中文字符的正则表达式: [\u4e00-\u9fa5]。

参考资料:1
《PHP&MySQL Novice to Ninja》(Kevin Yank [澳])
正则表达式 - 菜鸟教程
preg-replace - 官方手册

  1. 匹配时,*+会很贪婪(greedy)的包含尽可能多的字符。 ↩

你可能感兴趣的:(PHP,正则表达式,进阶级)