模式修正符
模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明。
常用的模式修正符如下:
模式修正符 | 说明 |
---|---|
i | 模式中的字符将同时匹配大小写字母 |
m | 字符串视为多行 |
s | 将字符串视为单行,换行符作为普通字符 |
x | 将模式中的空白忽略 |
e | preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 |
A | 强制仅从目标字符串的开头开始匹配 |
D | 模式中的 $ 元字符仅匹配目标字符串的结尾 |
U | 匹配最近的字符串 |
u | 模式字符串被当成 UTF-8 |
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
语法:
int preg_match( string pattern, string subject [, array matches ] )
参数 | 说明 |
---|---|
pattern | 正则表达式 |
subject | 需要匹配检索的对象 |
matches | 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推 |
preg_match_all()
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
语法:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
参数 | 说明 |
---|---|
pattern | 正则表达式 |
subject | 需要匹配检索的对象 |
matches | 存储匹配结果的数组 |
flags | 可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有:
|
preg_replace()
函数用于正则表达式的搜索和替换。
语法:
mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit ] )
参数 | 说明 |
---|---|
pattern | 正则表达式 |
replacement | 替换的内容 |
subject | 需要匹配替换的对象 |
limit | 可选,指定替换的个数,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换 |
补充说明
- replacement 可以包含 \\n 形式或 $n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 \\0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。
- 对替换模式在一个逆向引用后面紧接着一个数字时(如 \\11),不能使用 \\ 符号来表示逆向引用。因为这样将会使 preg_replace() 搞不清楚是想要一个 \\1 的逆向引用后面跟着一个数字 1 还是一个 \\11 的逆向引用。解决方法是使用 \${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。
- 上述参数除 limit 外都可以是一个数组。如果 pattern 和 replacement 都是数组,将以其键名在数组中出现的顺序来进行处理,这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用 ksort() 函数对数组进行排序。
例子 1 :
<?php $str = "The quick brown fox jumped over the lazy dog."; $str = preg_replace('/\s/','-',$str); echo $str; ?>
输出结果为:
The-quick-brown-fox-jumped-over-the-lazy-dog.
例子 2 ,使用数组:
<?php $str = "The quick brown fox jumped over the lazy dog."; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; print preg_replace($patterns, $replacements, $str); /*输出: The bear black slow jumped over the lazy dog. */ ksort($replacements); print preg_replace($patterns, $replacements, $str); /*输出: The slow black bear jumped over the lazy dog. */ ?>
例子 3 ,使用逆向引用:
<?php $str = '<a href="http://www.5idev.com/">5idev</a>其他字符<a href="http://www.sohu.com/">sohu</a>'; $pattern = "/<a\s([\s\S]*?)>([\s\S]*?)<\/a>/i"; print preg_replace($pattern, '\\2', $str); ?>
输出结果为:
5idev其他字符sohu
该例子演示了将文本中所有的 <a></a> 标签去掉。
preg_split()
preg_ split() 函数用于正则表达式分割字符串。
语法:
array preg_split( string pattern, string subject [, int limit [, int flags]] )
返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。
参数 | 说明 |
---|---|
pattern | 正则表达式 |
subject | 需要匹配分割的对象 |
limit | 可选,如果指定了 limit ,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flags |
flags | 设定 limit 为 -1 后可选,可以是下列标记的任意组合(用按位或运算符 | 组合):
|
例子 1 :
<?php $str = "php mysql,apache ajax"; $keywords = preg_split("/[\s,]+/", $str); print_r($keywords); ?>
输出结果为:
Array ( [0] => php [1] => mysql [2] => apache [3] => ajax )
例子 2 :
<?php $str = 'string'; $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); print_r($chars); ?>
输出结果为:
( [0] => s [1] => t [2] => r [3] => i [4] => n [5] => g )
例子 3 :
<?php $str = "php mysql,apache ajax"; $keywords = preg_split("/[\s,]+/", $str, -1, PREG_SPLIT_OFFSET_CAPTURE); print_r($keywords); ?>
输出结果为:
Array ( [0] => Array ( [0] => php [1] => 0 ) [1] => Array ( [0] => mysql [1] => 4 ) [2] => Array ( [0] => apache [1] => 10 ) [3] => Array ( [0] => ajax [1] => 17 ) )
split()
split() 函数同 preg_split() 类似,用正则表达式将字符串分割到数组中,返回一个数组,但推荐使用 preg_split() 。
语法:
array split( string pattern, string string [, int limit] )
如果设定了 limit ,则返回的数组最多包含 limit 个单元,而其中最后一个单元包含了 string 中剩余的所有部分。如果出错,则返回 FALSE。
例子:
<?php $date = "2008-08-08 20:00:01"; print_r( split('[- :]', $date) ); ?>
输出结果:
Array ( [0] => 2008 [1] => 08 [2] => 08 [3] => 20 [4] => 00 [5] => 01 )
提示
- 如果不需要正则表达式的功能,可以选择使用更快(也更简单)的替代函数如 explode() 或 str_split() 。
- split() 函数对大小写敏感,如果在匹配字母字符时忽略大小写的区别,请使用用法相同的 spliti() 函数