正则表达式

字符串规则的表达式

初识规则

· 具体字符

· 字符边界

· 字符集合[abcde],[0123456]

· 字符补集[^adc]:不在abc范围内

· 字符范围

· 字符簇

字符边界

1
2
3
4
- ^ 匹配字符串的开始
- $ 匹配字符串的结尾
- \b 匹配单词的开始和结尾(边界)
- \B 匹配单词的非边界

字符簇

1
2
3
4
5
6
7
8
9
10
11
+-------+---------------------+
| 簇 | 含义 |
+-------+---------------------+
| . (点)| 任意字符,不含换行 |
| \w | [a-zA-Z0-9_] |
| \W | \w的补集 |
| \s | 空白符,包括\n\r\t\v等 |
| \S | 非空白符 |
| \d | [0-9] |
| \D | 非数字 |
+-------+---------------------+

单词匹配

1
2
3
4
5
6
7
8
9
10
// 把字符串的hi单词找出来
$patt = '/\bhi\b/';
$str = 'hi, this is some history book';
preg_match_all($patt, $str, $res);
print_r($res);
// 包含在单词内hi找出来
$patt = '/\Bhi\B/';
$str = 'hi, this is some history book';
preg_match_all($patt, $str, $res);
print_r($res);

集合与补集示例

1
2
3
4
5
6
7
8
9
10
11
/*
给定手机号,必须由[01235689] 组成
从字符串的开始找,找到字符结束^$
*/
$patt = '/^[01235689]{11}$/';
$patt = '/^[^47]{11}$/';
$arr = array('13800138000','13426060134','170235','18289881234568782');
foreach($arr as $v) {
preg_match_all($patt, $v, $res);
print_r($res);
}

字符范围

1
2
3
4
5
6
// 找纯字母组成的单词
$str = 'o2o, b2b, hello,world, that';
//$patt = '/\b[a-zA-Z]{1,}\b/'; //{1,}最少1个字母
$patt = '/\b[a-zA-Z]+\b/';
preg_match_all($patt, $str, $res);
print_r($res);

字符簇

就是系统规定好的表示方法

1
2
3
4
5
6
7
8
9
10
// 把单词拆开
$str = 'tommorw is another day , o2o , you dont bird me i dont bird you';
$patt = '/\W{1,}/'; // \W \w[a-zA-Z0-9]的补集
//preg_split 通过正则表达式,分割字符串
print_r(preg_split($patt, $str));
//把多个空格或制表换成1个空格
$str = 'a b heloo world'; // 'a b hello world';
$patt = '/\s{1,}/'; //\s空白字符,包括 \n\r\t\v等ᒵ
//preg_replace — 执行正则的搜索和替换
echo preg_replace($patt, ' ', $str);

匹配几个

* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
\? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,m} m 和 n 均为非负整数,其中n <= m 最少匹配 n 次且最多匹配 m 次。
{n,} n 是一个非负整数。至少匹配n 次。

1
2
3
4
5
6
7
8
9
10
// 5个字母组成单词
$patt = '/[a-zA-Z]{5}/';
// 3-5个字母组成单词
$patt = '/[a-zA-Z]{3,5}/';
// 5个以上字母组成单词
$patt = '/[a-zA-Z]{5,}/';
$s = 'goooood,goood,goooooooooood';
$p = '/go+d/';
print_r(preg_replace($p,'god',$s));

或者的用法

1
2
3
4
5
6
7
8
9
10
// 查询纯数字或纯字母
$str = 'hello o2o 2b9 250';
$patt = '/\b[a-zA-Z]+\b|\b[0-9]+\b/';
preg_match_all($patt, $str, $res);
print_r($res);
//查询苹果系列产品
$str = 'ipad,iphone,imac,ipod,iamsorry';
$patt= '/\bi(pad|phone|mac|pod)\b/';
preg_match_all($patt, $str, $res);
print_r($res);

贪婪与非贪婪

1
2
3
4
5
6
7
8
$str = 'ksda good goooood good kl s ja dfs dk '
// 把g(任意多内容)d 这样的字符串,换成god
$patt = '/g.+d/'; // 默认贪婪模式(会尽量多的匹配)
preg_match_all($patt, $str, $res);
print_r($res); // god is not good
$patt = '/g.+?d/'; //在数量(+ * {n,})限定符后,加?,非贪婪模式
preg_match_all($patt, $str, $res);
print_r($res); // god , good

采集手机号

1
2
3
4
5
$str = '王先生,联系13800138000,备用电话18902587413, QQ:258963,emai l:wang@qq.com, 身份证号: 1011011979112123036'
// 采集电话号码
$patt = '/\b1[358]\d{9}\b/';
preg_match_all($patt, $str, $res);
print_r($res);