正则表达式 笔记

一、正则表达式
1)理解:正则表达式是一种字符串搜索与匹配的工具
2)正则表达式到底是什么?


二、PHP中常用的正则表达式函数
编写了一个输出函数 如下:
function show($var = null){
if(empty($var)){
echo "null";
}elseif (is_array($var) || is_object($var)) {
echo "<pre>";
print_r($var);
echo "</pre>";
}else{
echo "$var";
}
}


说明:
$pattern = 正则表达式(模式)
$subject = 匹配的目标数据(字符串/数组)


1) preg_match()
   int preg_match($pattern,$subject[,array &$matches]);
   在匹配的时候,只会匹配一次。
   如果写了第三个参数,就将匹配的结果放到matches这个数组中。
   return 匹配到结果的次数




2) preg_match_all()
   int preg_match_all($pattern,$subject,array &$matches);
   在匹配的时候,会将所有符合$pattern的结果全部匹配出来。
   将匹配的结果放到matches这个数组中。
   return 匹配到结果的次数


-------------------------------------------------
写个例子理解一下这两个函数:
$pattern = '/[0-9]/';
$subject = 'gongxin12nideug34bh5fbfuw7vew90ve';


$m1 = $m2 = array();


$t1 = preg_match($pattern,$subject,$m1);
$t2 = preg_match_all($pattern, $subject, $m2);


show($m1);
show($m2);
show($t1 .'||'. $t2);


/************/
输出:
Array
(
    [0] => 1
)
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 7
            [6] => 9
            [7] => 0
        )


)
1||8
-------------------------------------------------


3) preg_replace($pattern,$replacement,$subject);
   参数:(模式,替换的字符,包含被替换字符的字符串)
   替换匹配模式的所有字符串


4) preg_filter($pattern,$replacement,$subject);
   参数:同 3)
   基本和3)相同,只是如果把三个参数都变成数组,返回的结果会不同,这里就不做探究了。


-------------------------------------------------
来个例子理解一下:
$pattern = '/[0-9]/';
$subject = 'gongxin12nideug34bh5fbfuw7vew90ve';
$replacement = '#';


$str1 = preg_replace($pattern,$replacement,$subject);


$str2 = preg_filter($pattern,$replacement,$subject);


show($str1);
echo "<br />";
show($str2)


/**********************/
输出:
gongxin##nideug##bh#fbfuw#vew##ve
gongxin##nideug##bh#fbfuw#vew##ve
-------------------------------------------------
 
  5) preg_grep($pattern,array $input); 
     阉割版的preg_filter(...)
     只做匹配,不做替换。
     只会匹配到符合正则的数组,并返回
-------------------------------------------------
     如:
        $pattern = '/[0-9]/';
$subject = array('gong',
'xin12',
'nideu',
'g34bh5',
'fbfuw7',
'vew90ve');
$arr = preg_grep($pattern,$subject);
show($arr);


/***********************/
输出:
Array
(
    [1] => xin12
    [3] => g34bh5
    [4] => fbfuw7
    [5] => vew90ve
)
-------------------------------------------------


6) preg_split($pattern,$subject);
   通过正则匹配字符串,用匹配到的字符串作为分割点,来分割$subject字符串。将分割后的字符串,放到一个数组中返回。
-------------------------------------------------
小例子:


$pattern = '/[0-9]/';
$subject = '慕1课2网3约4吗';


$arr = preg_split($pattern,$subject);
show($arr);


/*****************/
输出:
Array
(
    [0] => 慕
    [1] => 课
    [2] => 网
    [3] => 约
    [4] => 吗
)
-------------------------------------------------


7) preg_quote($str);
   把一个字符串中的正则运算符,进行转义。
-------------------------------------------------
例:
$str = 'qwe{abc}[123]';
$str = preg_quote($str);
show($str);


    /**************/
    输出:
    qwe\{abc\}\[123\]

    -------------------------------------------------



一、 语法要点归类
1、界定符
2、原子
3、量词
4、边界控制
5、模式单元


二、界定符
表示一个正则表达式的开始和结束,'/ ... /'
如:/[0-9]/
除了两条斜杠也可以别的,比如:#[0-9]#、{[0-9]}等


三、正则表达式工具
regexpal

已下载本地的,见百度网盘。

        点击下载



四、原子
原子是正则表达式中最小的匹配单位,通常他只是Unicode编码表中的一个字符。
1)可见原子:Unicode编码表中用键盘输入后肉眼可见的字符
2)不可见原子:Unicode编码表中用键盘输入后肉眼不可见的字符。 如:换行符、回车、制表符、空格.....
注意:文字的匹配的话,最好转换成Unicode编码在写入。
不可见原子匹配,如制表符要用\t 回车用\n(回车看不到效果)


五、 元字符
1)定义原子的筛选方式
a. |   匹配两个或多个分支选择(或者)
b. []  匹配中括号中的任意一个原子(一个);
c. [^] 匹配除了中括号中的原子之外的任意字符。^必须是中括号的第一个。
2)将比较相似(如a-z)的原子进行归类给出一个缩写,来简化正则的书写方式。
a.如: [a-z]、[A-Z]、[1-9]、[a-zA-Z1-9]


3)定义原子的集合
a.  . :英文点,匹配除了换行的 符之外的任意字符。  
b. \d :匹配任意一个十进制数字,即[0-9]
c. \D :匹配任意一个非十进制的数字,即[^0-9]
d. \s :匹配一个不可见的原子,即[\f\n\r\t\v]
e. \S :匹配一个可见的原子,即[^\f\n\r\t\v]
f. \w :匹配任意一个数字、字母或下划线,即[0-9a-zA-Z_]
g. \W :匹配任意一个非数字,字母或下划线,即[^0-9a-zA-Z_]


六、量词
就是在一个字符串中查找一个原子连续出现多少次。
1){n}  : 表示其前面的原子恰好出现n次
2){n,} : 表示其前面的原子最少出现n次
3){n,m}: 表示其前面的原子最少出现n次,最多出现m次。
4)  *  : 匹配0次,1次或者多次其之前的原子,即{0,}
5)  +  : 匹配1次或者多次其之前的原子,即{1,}
6) ? : 匹配0次或1次其之前的原子,即{0,1}


七、边界控制与模式单元
1)边界控制
a. ^ : 匹配字符串开始的位置。(限制字符串必须以指定的模式开头)
       如: ^Duang 只能匹配到 Duang(这个单词前面不能有任何东西)
b. $ : 匹配字符串结尾的位置。(必须以指定的字符串结束,且字符串后面不能有东西)


2)模式单元
() 匹配其中的整体为一个原子。




-------------------模式修正---------------------------
一、修正模式
给正则表达式匹配过程指定一种匹配模式。
1)贪婪匹配:匹配结果存在歧义时取其长。
例:
$pattern = '/imooc.+123/';
$subject = 'I love imooc__123123123123123123';


$arr = array();
preg_match($pattern,$subject,$arr);
show($arr);


/*******输出*******/
Array
(
    [0] => imooc__123123123123123123
)


2)懒惰匹配:匹配结果存在歧义时取其短。(U)
例:变成懒惰模式 加 U
$pattern = '/imooc.+123/U';
/********输出*******/
Array
(
    [0] => imooc__123
)
3)常见的修正模式
a. U/u 懒惰匹配/贪婪匹配
b. i 忽略英文字母大小写
c. x 忽略空白
d. s 让元字符‘.’匹配包括换行符在内的所有字符。
e. e 
---------------------实战-----------------------------
一、非空匹配
1)非空 == 原子出现的次数为一次到无穷大次。
2)   '/.+/'


二、浮点数匹配
1)带两位小数的浮点数 == 数字连续出现1次到无穷大次,后跟一个小数点,在后面是两个数字。
2)'/\d+\.\d{2}/U'


三、手机号匹配
1(3|5|7|8|4)\d{9}


四、email地址
\w+(\.\w+)*@\w+(\.\w+)+
五、URL地址
^(https?://)?(\w+\.)+[a-zA-Z]+
















猜你喜欢

转载自blog.csdn.net/qq_39125684/article/details/80519480