正则表达式

正则三要素

  正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

  1. 从哪找?

  2. 找谁?

  3. 找几个?

[TOC]

从哪找?

^ 匹配字符串的开始

$ 匹配字符串的结尾

\b 匹配单词的开始和结尾(边界)

\B 匹配单词的非边界

找谁?

  1. 找具体的字符,直接写字面值,如 hi,hello
  2. 字符集合[ace],[01235689]
  3. 字符补集[^qxz]:不在qxz范围内
  4. 字符范围[a-z0-9]
  5. 字符簇(定义好的常用集合)
  • \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));

 

posted @ 2017-08-16 11:11  张朝阳的博客  阅读(163)  评论(0编辑  收藏  举报