字符边界
^匹配字符串的开始
$匹配字符串的结尾
\b匹配单词的开始和结尾(边界)
\B匹配单词的非边界
常用字符簇(就是系统规定好的表示方法)
簇 代表
.(点) 任意字符,不含换行
\w [a-z A-Z 0-9_ ]
\W \w 的补集
\s 空白符,包括\n\r\t\v等
\S 非空白符
\d [0-9]
\D 非数字
.(点) 任意字符,不含换行
\w [a-z A-Z 0-9_ ]
\W \w 的补集
\s 空白符,包括\n\r\t\v等
\S 非空白符
\d [0-9]
\D 非数字
字符集合[ace],[01235689]
字符补集[^ qxz ]:不在qxz范围内
字符补集[^ qxz ]:不在qxz范围内
匹配数次
*匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
\? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的n 次
{n,m} m 和n 均为非负整数,其中n <= m
最少匹配 n 次且最多匹配 m 次。。
{n,} n 是一个非负整数。至少匹配n 次。
+ 匹配前面的子表达式一次或多次。
\? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的n 次
{n,m} m 和n 均为非负整数,其中n <= m
最少匹配 n 次且最多匹配 m 次。。
{n,} n 是一个非负整数。至少匹配n 次。
匹配单词
<?php
// 把字符串的单词mi找出来
// \b \b 匹配单词的开始和结尾(边界)
$str = 'mi miss whomiwho hmim mistry';
$patt = '/\bmi\b/';
preg_match_all($patt, $str,$res);
print_r($res); //输出Array ( [0] => Array ( [0] => mi ) )
?>
<?php
//把单词内部的mi找出来
$str = 'mi miss whomiwho hmim mistry';
$patt = '/\Bmi\B/';
preg_match_all($patt, $str,$res);
print_r($res); //Array ( [0] => Array ( [0] => mi [1] => mi ) )
?>
集合与补集示例
<?php
/*找出不包含4,7的11位号码*/
$patt = '/^[01235689]{11}$/';
//$patt = '/^[^47]{11}$/'; //补集方式 等价于^[01235689]{11}$
$arr = array('13825593939','1342770134','1730235','1864562321323');
foreach($arr as $v) {
preg_match_all($patt, $v, $res);
print_r($res);
//输出Array ( [0] => Array ( [0] => 13825593939 ) ) Array ( [0] => Array ( ) ) Array ( [0] => Array ( ) ) Array ( [0] => Array ( ) )
}
?>
字符范围
<?php
//找出纯字母组成的单词
$str = 'o2o, b2b, bye,good, yes';
$patt = '/\b[a-zA-Z]+\b/';
preg_match_all($patt, $str, $res);
print_r($res);//输出Array ( [0] => Array ( [0] => bye [1] => good [2] => yes ) )
?>
<?php
//把单词拆开
$str = 'tommorw is a good day , i will ride my bike travell';
$patt = '/\W{1,}/'; // \W \w[a-zA-Z0-9]的补集
print_r(preg_split($patt, $str));//preg_split通过正则分割字符串
//输出Array ( [0] => tommorw [1] => is [2] => a [3] => good [4] => day [5] => i [6] => will [7] => ride [8] => my [9] => bike [10] => travell )
?>
<?php
//把空白符,包括 \n\r\t\v 等换成一个空格
$str = 'a b heloo world';
$patt = '/\s{1,}/'; // \s 空白符,包括 \n\r\t\v等
//preg_replace 执行一个正则表达式的搜索和替换
echo $str; //输出a b heloo world
echo preg_replace($patt, ' ', $str); //输出a b heloo world
?>
<?php
// 5个字母组成的单词
//$patt = '/[a-zA-Z]{5}/';
//3-5个字母组成的单词
//$patt = '/[a-zA-Z]{3,5}/';
//5个字母以上组成的单词
//$patt = '/[a-zA-Z]{5,}/';
$s = 'goooood,goood,goooooooooood';
//把以上单词替换成god
$p = '/go+d/'; //+:1个或多个o
print_r(preg_replace($p,'god',$s)); //输出god,god,god
?>
或者的用法
<?php
//找出纯数字或者纯字母
$str = "yesterday 222 we are 666 fun";
$patt= '/\b[a-zA-Z]+\b|\b\d+\b/';//或者的符号 | d\等于[0-9]
preg_match_all($patt, $str,$res);
print_r($res);
//输出Array ( [0] => Array ( [0] => yesterday [1] => 222 [2] => we [3] => are [4] => 666 [5] => fun ) )
?>
贪婪模式与非贪婪模式
<?php
//匹配g(任意多的内容)d
$str = 'hello world good goooods ok you it is dog';
$patt = '/g.+d/'; // .表示任意字符 默认贪婪模式(会尽量多的去匹配)
preg_match_all($patt, $str, $res);
print_r($res);
//输出Array ( [0] => Array ( [0] => good goooods ok you it is d ) )
?>
<?php
//匹配g(尽量少的内容)d
$str = 'hello world good goooods ok you it is dog';
$patt = '/g.+?d/'; // 非贪婪模式 在数量(+ *{n,})限定符后加?
preg_match_all($patt, $str, $res);
print_r($res);
//输出Array ( [0] => Array ( [0] => good [1] => gooood ) )
?>
从字符串采集手机号
<?php
//采集字符串里的手机号
$str = "我的手机号码是18234576899 什么21713422789001 备用号码13800138000";
$patt = '/\b1[3458]\d{9}\b/';
preg_match_all($patt, $str, $res);
print_r($res);//Array ( [0] => Array ( [0] => 18234576899 [1] => 13800138000 ) )
?>
后向引用
<?php
//找出下列首尾字母相同的单词
$str = "num mum yes loll what txt";
$patt = '/\b([a-z])\w+\1\b/'; //第n个小括号内的子表达式,后面就有\n来引用
preg_match_all($patt, $str, $res);
print_r($res);
//输出Array ( [0] => Array ( [0] => mum [1] => loll [2] => txt ) [1] => Array ( [0] => m [1] => l [2] => t ) )
?>
<?php
//后向引用替换
$str = "13800138000 18219333331";
$patt = '/(\d{3})\d{4}(\d{3})/'; //替换中间四位为****
print_r(preg_replace($patt,'\1****\2', $str));
//输出138****8000 182****3331
?>
模式的用法
模式修饰符,可以一定程度上影响正则的解析行为
比如i,就代表正则不区分大小写, /[a-z A-Z ]+/ --->/[a-z ]+/i
比如s,单行模式,就代表把整个文件看成一个"单行"
比如i,就代表正则不区分大小写, /[a-z A-Z ]+/ --->/[a-z ]+/i
比如s,单行模式,就代表把整个文件看成一个"单行"
<?php
$str = 'hello WHAT Where Are YOU';
//$patt = '/\b[a-z]+\b/'; //hello
$patt = '/\b[a-z]+\b/i'; //忽略大小写
preg_match_all($patt, $str, $res);
print_r($res);
//Array ( [0] => Array ( [0] => hello [1] => WHAT [2] => Where [3] => Are [4] => YOU ) )
?>
u模式,把传入的参数看成是unicode字符集的编码,可以判断中文
PHP模式下匹配中文,u模式 \x{4e00}-\x{9fa5}
<?php
$str = 'wxu吴';
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';
echo preg_match($patt, $str) ? '纯中文' : 'no'; //no
?>