/*新手的个人见解,勿以标准作量,-珍惜少年时*/
每天都在学习每天都在更新...
米哥跟我说:“正则表达式说白了就是字符匹配。” 以下是我学习当中的笔记。
正则表达式(Regular Expression)是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。这就是正则的功能!
正则表达式由:定界符、原子、元字符、模式修改符组成。
/\d{4}/:这就是一个简单而又完整的正则
定界符:一般用"//",也可以用别的比如"{}"、"||"
原子:最小的匹配单位,就是我们要找的字符里最小的单位。写在定界符当中。
元字符:修饰原子,拓展原子功能和限定功能。比如“/7{5}/”中{5}就是用来修饰原子7的,{5}就是一个元字符。元字符要写在定界符里面。/7{5}/:的意思是说原子7的旁边必须要有5。
模式修订符号:修饰正则表达式,对模式(正则)修正,卸载定界符的外面。
原子
- 打印字符:也就是我们能够打印出来的字符,能够看得到的。比如0-9,a-z,A-Z,!@.....等等。能够看得到的。注:除了a-z,A-Z,0-9以外的符号尽量加转义符号处理。转义字符能够将有意义的转化为没有意义的,没有意义的转化为有意义的。
- 非打印字符:比如“回车”,,“tab键”.....等等。
正则表达式函数:preg_match (pattern , subject, matches)
参数 | 描述 |
---|---|
pattern | 正则表达式 |
subject | 需要匹配检索的对象 |
matches | 可选,存储匹配结果的数组 |
与之雷同的函数还有一个preg_match_all,该函数多用的功能就是可以打印所有匹配的,并打印为数组。
动手写第一个正则:
<?php
$str="i love pc";
$reg="/pc/";
if(preg_match($reg,$str,$arr)){
echo "正则表达式:<b>{$str}</b>和<b>{$reg}</b>匹配成功</b><br>";
print_r($arr);
}else{
echo "正则表达式:<b>{$str}</b>没有和<b>{$reg}</b>匹配成功";
print_r($arr);
}
?>
输出:
正则表达式:i love pc和/pc/匹配成功
Array ( [0] => pc )
元字符
- ^ 和 \A 表示必须以什么开头,这个必须要写在正则的前面。
- $ 和 \Z 表示必须以什么结束,这个必须要放在表达式的最后面。
常用的元字符
\b:单词边界,原子的左侧,即为成功,右侧无love单词即为失败。若\blove\b即是两侧。需要 两侧都要有love这个单词才匹配成功。\B与之相反。
<?php
$str="ilove love pc";
$reg="/\blove/";
if(preg_match($reg,$str)){
echo "匹配成功";
}else{
echo "匹配失败";
}
?>
输出:
匹配成功
/^abc.*abc$/
表示必须以 abc为开始,abc结束。中间随意。因为点的意思就是任意的原子,而*则表示任意的次数。
一个简单的匹配日期表达式:
/\d{4}-\d{2}-\d{2}/
\d表示匹配的只能是数字,{4}表示匹配的数是四位的,-为连接符。#注:如果想要不限制长度,假设年不是四位数的,是1到5位数的,那么即{1,5}跟数学当中的集合类似。故有正无穷之说。但无负无穷,原因摸摸脚丫子都知道。
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n ”匹配字符“n ”。“\n ”匹配一个换行符。串行“\\ ”匹配“\ ”而“\( ”则匹配“( ”。 |
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n ”或“\r ”之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n ”或“\r ”之前的位置。 |
* | 匹配前面的子表达式零次或多次。例如,zo*能匹配“z ”以及“zoo ”。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,“zo+ ”能匹配“zo ”以及“zoo ”,但不能匹配“z ”。+等价于{1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)? ”可以匹配“does ”或“does ”中的“do ”。?等价于{0,1}。 |
{n} | n是一个非负整数。匹配确定的n次。例如,“o{2} ”不能匹配“Bob ”中的“o ”,但是能匹配“food ”中的两个o。 |
{n,} | n是一个非负整数。至少匹配n次。例如,“o{2,} ”不能匹配“Bob ”中的“o ”,但能匹配“foooood ”中的所有o。“o{1,} ”等价于“o+ ”。“o{0,} ”则等价于“o* ”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3} ”将匹配“fooooood ”中的前三个o。“o{0,1} ”等价于“o? ”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“ |
更多正则表达式全集传送门:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
模式修订符号
模式修正符 | 说明 |
i | 表示在和模式进行匹配进不区分大小写 |
m | 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束 |
s | 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行 |
x | 表示模式中的空白忽略不计 |
e | 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说) |
A | 以模式字符串开头,相当于元字符^ |
Z | 以模式字符串结尾,相当于元字符$ |
U | 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式 |
使用字符i演示如下:
<?php
$str="this is TEST";
$reg="/test/i";
if(preg_match($reg,$str)){
echo "匹配成功";
}else{
echo "匹配失败";
}
?>
输出:
匹配成功
使用字符M演示如下:
<?php
/*****************************Test**1*****************************/$str1="hello world
abcxishaonian nihao
i love chinakungfu";
$reg1="/^abc/";
if(preg_match($reg1,$str1,$arr)){
echo "{$reg1}匹配{$str1}成功<br>";
}else{
echo "{$reg1}匹配{$str1}失败<br>";
}
/***************************Test**2**********************************/
$str2="hello worldabcxishaonian nihao
i love chinakungfu";
$reg2="/^abc/m";
if(preg_match($reg2,$str2,$arr)){
echo "{$reg2}匹配{$str2}成功<br>";
}else{
echo "{$reg2}匹配{$str2}成功";
}
?>
输出:
/^abc/匹配hello world abcxishaonian nihao i love chinakungfu失败
/^abc/m匹配hello world abcxishaonian nihao i love chinakungfu成功
使用字符S演示如下:
<?php
$str="china HelloWorld kungfu.nihao,halou.meximexi";
$reg="/hello world/i";
if(preg_match($reg,$str)){
echo "案例一匹配成功<br>";
}else{
echo "案例一匹配失败<br>";
}
$str2="china HelloWorld kungfu.nihao,halou.meximexi";
$reg2="/hello world/ix";
if(preg_match($reg2,$str2)){
echo "案例二匹配成功<br>";
}else{
echo "案例二匹配失败";
}
?>
输出:
案例一匹配失败
案例二匹配成功
使用字符U演示如下:
<?php
$str="<b>你好,世界</b>,劝君珍惜少年时。<b>hello world</b>";
$reg="/\<b\>.*\<\/b\>/U";
if(preg_match_all($reg,$str,$arr)){
echo "{$reg}匹配成功{$str}<br>";
}else{
echo "{$reg}匹配失败{$str}<br>";
}
$str2="<B>你好,世界</b>,劝君珍惜少年时。<b>hello world</B>";
$reg2="/\<b\>.*?\<\/b\>/i";
if(preg_match_all($reg2,$str2,$arr)){
echo "{$reg2}匹配成功{$str2}<br>";
}else{
echo "{$reg2}匹配失败{$str2}<br>";
}
?>
输出:
/\<b\>.*\<\/b\>/U匹配成功你好,世界,劝君珍惜少年时。hello world
/\<b\>.*?\<\/b\>/i匹配成功你好,世界,劝君珍惜少年时。hello world
从中看得出来,字符U的效果跟.*?的作用是一样的。建议使用.*?因为U在部分的脚本里面不兼容
/*
关于正则的一些资料:
正则表达式的优先级:http://www.cnblogs.com/xishaonian/p/6089644.html
正则表达式的案例URL的匹配:http://www.cnblogs.com/xishaonian/p/6089638.html
待更新.....
*/