正则详解

\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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值