匹配原则
正则表达式在匹配字符串时,遵循以下2个基本原则:
1.最左原则:正则表达式总是从目标字符串的最左侧开始,依次匹配,直到匹配到符合表达式要求的部分,或直到匹配目标字符串的结束。
2.最长原则:对于匹配到的目标字符串,正则表达式总是会匹配到符合正则表达式要求的最长的部分;即贪婪模式
分隔符
当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以使任意非字母数字、非反斜线、非空白字符。
常用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。
当表达式有过多的转义字符时,建议优先使用#,如url;
$str = 'http://baidu.com';
$pattern = '/http:\/\/.*com/';//需要转义/
echo preg_match($pattern,$str,$match);
$pattern = '#http://.*com#';//不需要转义/
echo preg_match($pattern,$str,$match);
特殊字符
特别字符 | 说明 |
---|---|
^ | 1,匹配输入字符串的开始位置,如果设置模式修饰符为m,则 ^ 也匹配 ‘\n’ 或 ‘\r’之后字符。 2,在字符域[]中表示取反,如[^1-5],该字符不是1~5之间的数字 |
$ | 匹配输入字符串的结尾位置。如果设置模式修饰符为m,则 $ 也匹配 ‘\n’ 或 ‘\r’之前字符。 |
. | 匹配除换行符 \n之外的任何单字符。如果设置模式修饰符为s,则匹配所有字符。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。 |
[ ] | 1,字符集合(字符域)。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 2,匹配指定范围内的任意字符。例如,[a-zA-Z0-9]。 |
{ } | 限定符表达式 |
\ | 转义字符 |
| | 或选择。例如,'z|food' 能匹配 "z" 或 "food" |
限定符
限定符主要是用来限定每个字符串出现的次数。
限定字符 | 含义 |
---|---|
? | 零次或一次 |
* | 零次或多次 |
+ | 一次或多次 |
{n} | n次 |
{n,} | 至少n次 |
{n,m} | n到m次 |
预定义字符集
字符 | 含义 |
---|---|
\d | 任意一个十进制数字,等价于 [0-9]。 |
\D | 任意一个非十进制数字,等价于 [^0-9]。 |
\s | 任意一个空白字符(空格、换行符、换页符、回车符、字表符) |
\S | 任意一个非空白字符 |
\w | 任意一个单词字符,等价于[A-Za-z0-9_]。 |
\W | 任意个非单词字符,等价于 [^A-Za-z0-9_]。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
模式修饰符
模式修饰符的作用是设定模式,也就是正则表达式如何解释。
修饰符 | 说明 |
---|---|
i | 忽略大小写 |
m | 多文本模式,使用^和$表示任何一行都可以以正则表达式开始或结束 |
s | 点号元字符“.”匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行 |
x | 忽略空白字符 |
U | 取消贪婪模式 |
其它匹配语法
- (?:pattern) 匹配结果,但不进行存储供以后使用。
- (?=pattern) (?!pattern) 正向预查:在字符串右侧必须匹配(或不匹配)pattern。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 匹配结果是"Windows2000" 中的 "Windows" ,不包含后面的“2000”。
- (?<=pattern) (?<!pattern)逆向预查:在字符串左侧必须匹配(或不匹配)pattern。同上。
-
\num反向引用:就是依靠子表达式的”记忆”功能,匹配连续出现的字串或是字符。如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。字符串是否有重复字符:(\w).*\1
-
?惰性匹配:默认为贪婪匹配,也就是就是匹配尽可能多的字符。惰性匹配只需要在其后面添加一个”?”即可。如字符串“manmant”,m.*n匹配到的字符串是“manman”,而m.*?n匹配到是“man”。
PHP正则函数
preg_match($pattern,$subject,[array &$matches])
preg_match_all($pattern,$subject,array &$matches)
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
preg_split ( string pattern,stringsubject [, int limit=−1[,intflags = 0 ]] )