正则表达式
正则三要素
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
-
从哪找?
-
找谁?
-
找几个?
[TOC]
从哪找?
^
匹配字符串的开始
$
匹配字符串的结尾
\b
匹配单词的开始和结尾(边界)
\B
匹配单词的非边界
找谁?
- 找具体的字符,直接写字面值,如 hi,hello
- 字符集合[ace],[01235689]
- 字符补集[^qxz]:不在qxz范围内
- 字符范围[a-z0-9]
- 字符簇(定义好的常用集合)
-
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]
。 -
\S
匹配任何非空白字符。等价于[^\f\n\r\t\v]
。 -
\w
匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]
。 -
\W
匹配任何非单词字符。等价于[^A-Za-z0-9_]
。 -
.
表示任意字符(\n换行符除外)
找几个?
*
匹配前面的子表达式零次或多次。
+
匹配前面的子表达式一次或多次。
?
匹配前面的子表达式零次或一次。
{n}
n 是一个非负整数。匹配确定的 n 次。
{n,m}
m 和 n 均为非负整数,其中n <= m 最少匹配 n 次且最多匹配 m 次。
{n,}
n 是一个非负整数。至少匹配n 次。
正则表达式在PHP中的应用
从哪找?
正则匹配下列字符串中的hi
字符
$str = 'hi this is my history book';
$patt = '/hi/';
preg_match_all($patt, $str, $res);
print_r($res);
正则匹配字符串包含在单词内部'hi'找出
$str = 'hi this is my history book';
$patt = '/\Bhi\B/';
preg_match_all($patt, $str, $res);
print_r($res);
找谁?
找下列字符串中纯字母组成的单词
$str = 'o2o,b2b,hello,world,think';
$patt = '/\b[a-zA-Z]+\b/';
preg_match_all($patt, $str, $res);
print_r($res);
找几个?
查询字符串中纯数字或纯字母的词
$str = 'hello o2o b2b 25';
$patt = '/\b[a-zA-Z]+\b|\b[0-9]+\b/';
preg_match_all($patt, $str, $res);
print_r($res);
找出字符串开始和结束处的空白字符
$str = '
hello world
';
$patt='/^\s+|\s+$/';
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);
贪婪与非贪婪 查找字符串中 'g??d'这样的字符串
$str = 'god is not good';
$patt = '/g.+d/'; // 贪婪模式 得到的是 god is not good
$patt = '/g.+?d/'; // 非贪婪模式 得到的是 array('god','good')
preg_match_all($patt, $str, $res);
print_r($res);
匹配11位手机号码
$arr = array(13509952342,13168517117,407156888,'407145777@qq.com',362203198708085462);
foreach ($arr as $key => $value) {
$patt = '/^1[34587][0-9]{9}$/';
preg_match_all($patt, $value, $res);
print_r($res);
}
找首尾字母想同的单词
$str = 'test txt hello high word';
$patt = '/\b([a-zA-Z])\w+\1\b/'; // 反向引用
preg_match_all($patt, $str, $res);
print_r($res);
把手机号的中间四位替换成 *
$str = '13800138000,13509952344';
$patt = '/(\d{3})\d{4}(\d{4})/';
// preg_match_all($patt, $str, $res);
// print_r($res);
echo preg_replace($patt, '\1****\2', $str);
把一段字符的首尾空白清除
$str = ' hello world ';
$patt = '/^\s+|\s+$/';
var_dump( preg_replace($patt, '', $str) );
找连续重复的字母修改为一个 如 aaabbbsscccdff -> abscdf
$str = 'aaabbbsscccdff';
$patt = '/([a-z])\1+/';
// preg_match_all($patt, $str, $res);
// print_r($res);
var_dump(preg_replace($patt, '\1', $str));
挫折是一份财富,经历是一份拥有。