\b 匹配字符串的开始和结尾(边界)
$str = 'hi his is this sthi';
$patt = '/\bhi\b/'; //单词找hi开始,单词找hi结束
preg_match_all($patt, $str, $matches);
var_dump($matches);
\B 匹配单词的非边界
$str = 'hi his is this sthi';
$patt = '/\Bhi\B/'; //单词找不是以hi开始,不是以hi结束
preg_match_all($patt, $str, $matches);
var_dump($matches);
字符集合[ace],[0123456789]
$str = array('13800138000','13426060134','170235','18289881234568782');
$patt = '/^[0123456789]{11}$/'; //找包含[]里面的,并且是11位
foreach ($str as $k => $v) {
preg_match_all($patt, $v, $matches);
var_dump($matches);
}
字符补集[^qxz]:不在qxz范围内
$str = array('13800138001','13426060134','170235','18289881234568782');
$patt = '/^[^47]{11}$/'; //找数组中不是4和7的11位数
foreach ($str as $k => $v) {
preg_match_all($patt, $v, $matches);
var_dump($matches);
}
字符范围[a-z0-9] +(代表多个) {1,}最少1位 {1,5}最少1位,最多5位
$str = 'baidu o2o b2b c2c heol haha aa ';
// $patt = '/\b[a-zA-z]+\b/'; //+号代表多个,不限,找出纯字母
$patt = '/\b[a-zA-z]{1,}\b/'; //找出纯字母,最少有1位字母
// $patt = '/\b[a-zA-z]{1,5}\b/'; //找出纯字母,最少有1位,最多有5位字母
preg_match_all($patt, $str, $res);
var_dump($res);
字符簇(系统定义好的常用集合)
\W \w的补集 (表示不是\w里面的)
\s 空白符,包括\n\r\t\v等
$str = 'a b hello wored';
echo $str.'<br/>';
$patt = '/\s{1,}/'; //去掉空格
echo preg_replace($patt, ' ', $str);
$str = 'baidu ,o2o b2b ,c2c heol haha aa ';
$patt = '/\W{1,}\W/'; //不包含字母数字下划线
preg_match_all($patt, $str, $res);
var_dump($res);
{n} n是一个非负整数。匹配确定的n次
$str = 'good goooooood goooooooooooooood gooood';
// $patt = '/\b\w{4,}\b/';
$patt = '/\b\w{4,9}\b/'; 取出最少4位,最多9位的
preg_match_all($patt, $str, $res);
var_dump($res);
+ 匹配前面的子表达式一次或多次
$str = 'good goooooood goooooooooooooood gooood';
//go开始,结尾是d的
$patt = '/go+d/';
echo preg_replace($patt,'good',$str);
var_dump($res);
| 或者的用法
$str = 'hello o2o 2b9 250';
//大小字字母开头,或者是数字开头
$patt = '/\b[a-zA-Z]+\b|\b\d+\b/';
preg_match_all($patt,$str,$res);
var_dump($res);
贪婪模式
$str = 'ksda good goooood good k1 d ja fsa kwkf';
//g开头一直找,到最后一个d结束 ,字符串中全找 贪婪模式
// $patt = '/g.+d/';
//每隔一个g开关d结尾就生成一个键值对 一直到找不到为止 非贪婪模式
$patt = '/g.+?d/';
preg_match_all($patt,$str,$res);
var_dump($res);
采集手机号 注意:正则不认识中文
$str = ' 你的手机号是多少? 手机13838383838 ,备用电话12012121212';
$patt = '/\b1[3587]\d{9}\b/';
preg_match_all($patt,$str,$res);
var_dump($res);
后向引用 第n个小括号内内的子表达式,命中的内容,后面就用\n来引用
$str = 'txt hello, high, bom , mum';
$patt = '/\b([a-z])\w+\1\b/'; //+\1第一次出现这个括号([a-z]) ([a-z])子表达式
// $patt = '/\b([a-z])([A-Z])\w+\2/'; //+\2第一次出现这个括号([A-Z])
preg_match_all($patt, $str, $res);
var_dump($res);
手机号加星星
$str = '13031033001 ,15826060134';
$patt = '/(\d{3})\d{4}(\d{4})/';
echo preg_replace($patt,'\1****\2',$str);
模式修饰符
i 代表正则不区分大小写
s 单行模式,代表把整个文件看成一个单行,将整个字符串看成一行
u 模式,把传入的参数看成是unicode字符集的编码,可以判断中文
$str = 'hello WORLD
ChIna';
$patt = '/.+/s';
preg_match_all($patt, $str, $res);
var_dump($res);
$str = 'hello WORLD ChIna';
$patt = '/\b[a-z]+\b/i';
preg_match_all($patt, $str, $res);
var_dump($res);
$str = 'a张';
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';
echo preg_match_all($patt, $str)?'纯中文':'非纯中文';
预查
// 前瞻,意思就是,查找的时候,第一位是字母的。。。
// 断言,走到ing,停下
// 正预测:退回三位
// 零宽度
$str = 'hello ,when i am working , don not coming';
//后边如果是ing,看后面是不是ing,如果是,就拿出来ing前面的字母
$patt = '/\b\w+(?=ing\b)/';
preg_match_all($patt, $str, $res);
print_r($res);
// 把不是ing结尾的单词部分找出来 满足3个并且后面不是ing
// 前瞻 、断言、零宽度,负预测
$str = 'hello ,when i am working , don not coming';
$patt = '/\b\w+(?!ing)\w{3}\b/'; //不是ing结尾,并且最少3位的
preg_match_all($patt, $str, $matches);
print_r($matches);
// 以un开头的单词词根找出来
// 零宽度 正预测 回顾 断言
$str = 'luck ,unlucky, state , unhappy';
$patt = '/(?<=\bun)\w+\b/'; //un开头的字母,截取下来,不带un
preg_match_all($patt, $str, $matches);
print_r($matches);
// 以非un开头的单词词找出来
// 零宽度 负预测 回顾 断言
$str = 'luck ,unlucky, state , unhappy';
$patt = '/\b\w{2}(?<!un)\w*\b/'; //不是un开关的
preg_match_all($patt, $str, $matches);
print_r($matches);