//正则匹配真的会让人疯掉............
0x01 正则匹配的元字符
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
[x] | 匹配x字符,如匹配字符串中的[a]则匹配字符a |
\W | \w的反义,即匹配任意非字母,数字,下划线和汉字的字符 |
\S | \s的反义,即匹配任意非空白符的字符 |
\D | \d的反义,即匹配任意非数字的字符 |
\B | \b的反义,即不是单词开头或结束的位置 |
[^x] | 匹配除了 x 以外的任意字符,如 [^abc] 匹配除了 abc 这几个字母之外的任意字符 |
提示
1.当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 \ 来表示转义,如要匹配 . 符号,则需要用 \. ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 \ ,则需要写成 \\
2.连续的数字或字母可以用 – 符号连接起来,如 匹配所有的小写字母,[1-5] 匹配 1 至 5 这 5 个数字
举个简单的匹配
^\d{5,}$
1. ^ 匹配开始
2. \d 匹配数字
3. {5,}至少匹配5位数以上
4. $ 表示字符串匹配的结束
0x02 正则匹配中的重复
* | 重复零次或者更多次 |
+ | 重复1次或者更多次 |
? | 重复零次或者1次 |
{n} | 重复n次 |
{n,} | 重复n次或者更多次 |
{n,m} | 重复n到m次 |
0x03 模式修正符
i | 模式中的字符将同时匹配大小写字母 |
m | 字符串视为多行 |
s | 将字符串视为单行,换行符作为普通字符 |
x | 将模式中的空白忽略 |
e | preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 |
A | 强制仅从目标字符串的开头开始匹配 |
D | 模式中的 $ 元字符仅匹配目标字符串的结尾 |
U | 匹配最近的字符串 |
u | 模式字符串被当成 UTF-8 |
0X04 正则表达式
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 ,第一次匹配成功后就会停止匹配。
preg_match ( pattern, subject [, array matches ] )。
pattern :正则表达式
subject:需要匹配检索的对象
matches:可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
preg_match_all()
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。可匹配多次。
preg_replace()
preg_replace() 函数用于正则表达式的搜索和替换。
preg_replace( pattern, replacement, subject [, int limit ] )
pattern:正则表达式
repalacement:替换的内容
subject:需要匹配替换的对象
limit:可选,指定替换的个数,如果省略或为-1,则所有的匹配都会被替换。
例子:
1 <?php 2 $str = "The quick brown fox jumped over the lazy dog."; 3 $str = preg_replace('/\s/','-',$str); 4 echo $str; 5 ?>
输出结果:
The-quick-brown-fox-jumped-over-the-lazy-dog.
例子2,使用数组:
1 <?php 2 $str = "The quick brown fox jumped over the lazy dog."; 3 4 $patterns[0] = "/quick/"; 5 $patterns[1] = "/brown/"; 6 $patterns[2] = "/fox/"; 7 8 $replacements[2] = "bear"; 9 $replacements[1] = "black"; 10 $replacements[0] = "slow"; 11 12 print preg_replace($patterns, $replacements, $str); 13 /*输出: 14 The bear black slow jumped over the lazy dog. 15 */ 16 ksort($replacements); 17 print preg_replace($patterns, $replacements, $str); 18 /*输出: 19 The slow black bear jumped over the lazy dog. 20 */ 21 ?>
例子 3 ,使用逆向引用:
1 <?php 2 $str = '<a href="http://www.5idev.com/">5idev</a>其他字符<a href="http://www.sohu.com/">sohu</a>'; 3 $pattern = "/<a\s([\s\S]*?)>([\s\S]*?)<\/a>/i"; 4 print preg_replace($pattern, '\\2', $str); 5 ?>
输出结果:
5idev其他字符sohu
preg_split()
preg_ split() 函数用于正则表达式分割字符串。
preg_split( pattern, subject [, int limit [, int flags]] )
pattern | 正则表达式 |
subject | 需要匹配分割的对象 |
limit | 可选,如果指定了 limit ,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flags |
flags | 设定 limit 为 -1 后可选,可以是下列标记的任意组合(用按位或运算符 | 组合): 1.PREG_SPLIT_NO_EMPTY:preg_split() 只返回非空的成分 2.PREG_SPLIT_DELIM_CAPTURE:定界符模式中的括号表达式也会被捕获并返回 3.PREG_SPLIT_OFFSET_CAPTURE:对每个出现的匹配结果也同时返回其附属的字符串偏移量。 注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。 |
例子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 ) )
ereg — 正则表达式匹配
ereg匹配到%00自动停止
参考文章:http://www.5idev.com/p-php_regular_syntax_1.shtml