07
作用表单验证网络爬虫函数库PCRE函数库正则表达式是具有特殊语法结构的字符串Regular Expression reg regexp
POSIX(不推荐使用)特点语法结构复杂执行效率低Perl兼容的正则表达式函数库
功能强大语法语法结构相对于同功能的字符串函数而言
定界符/正则表达式/模式修饰符
正则表达式必须写在定界符里面除了数字,字母和反斜杠的任意字符都可以做为定界符,一般用//定界符必须成对出现$pattern
模式规则的意思
$pattern="//";//定界符$pattern="##";//有效$pattern="11";//无效 定界符不能是数字$pattern="AA";//无效 定界符不能是字母$pattern="\\";//无效 定界符不能是反斜杠$pattern="/#";//无效 定界符必须成对出现
原子正则表达式中的最小原子一个正则表达式若想有意义,则至少包含一个原子普通字符元字符(特殊的原子)a
或1
或-
\s
匹配空格space
\S
匹配非空格\d
匹配数字decimal
\D
匹配非数字[^0-9]
\w
匹配单词(数字,大小写,下划线)[0-9a-zA-Z_]
\W
匹配非单词[^0-9a-zA-Z]
.
匹配任意字符
$subject="Hello, World";$pattern='/\s/';//\s匹配空格\//返回匹配结果的次数//将返回结果赋值给第三个参数$matchesecho preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/\S/";//\S大s 匹配非空格echo preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
$subject="This it test";$pattern="#s#";//普通的原子preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
$subject="I am 18";$pattern="/\d/";//匹配数字preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/\D/";//匹配数字preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
function isNumber($value){ //思路:如果非数字匹配不到,则为纯数字 //\D匹配失败时,匹配对象为纯数字 $pattern="/\D/"; if (!preg_match_all($pattern,$value)){ return true; } return false;}$value='123adb';$value='123';$suc=isNumber($value);echo $suc?"是数字":"不是数字";
$subject="I am_ 18.";$pattern="/\w/";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/\W/";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
$subject="I am 18.";$pattern="/./";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/\./";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
转义符(escape)\n
换行符newline\t
制表符声明 双引号可以解析以上的的转义符,单引号不行字符组正字符组可以在正字符组中给出多个原子,多个原子是"或"的关系$pattern="/[is]/";//匹配字母i或者字母s
常用的字符组(匹配范围)[0-9]
相当于\d
[a-z]
[A-Z]
负字符组[^xxxxxx]
量词用来修饰正则表达式出现的次数(数量)语法{n}
精确匹配==n==位{n,}
开区间匹配{n,m}
闭区间匹配,其中n,m都为正整数,n<m$subject="This iis test";$pattern="/i{2}/";
//匹配多位(,后面没有空格)$pattern="/i{1,}/";
$pattern="/i{2,3}/";//匹配2位到3位
?
匹配0
或1
位{0,1}
*
匹配0
位或多位{0,}
+
匹配1
位或多位{1,}
$pattern="/s\s?/";//匹配"s"或"s空格" ?代表0或1位$pattern="/s\s*/";//*匹配0到多位$pattern="/s\s+/";//+匹配1到多位
//匹配手机号//17375821270//手机号是11位的数字 \d{11}//手机号的第一位数字为1 1\d{10}//13X 15X 17X 18X//手机号第二位可能的数字是3578 [3578]//手机号第三位也有号段(暂不考虑)//177-1234-1234 1[3578]\d-?\d{4}-?\d{4}//17712341234//0177-1234-1234 0?1[3578]\d-?\d{4}-?\d{4}//+86 0177-1234-1234 (暂时省略)//匹配开头和结尾(边界),使用定位点符号 ^ $ ^0?1[3578]\d-?\d{4}-?\d{4}$// /^正则表达式$///思路://1.首先分析目标字符串的规律(模式)//2.将规律(模式)翻译成正则表达式//3.验证function isMobile($mobile){ $pattern="/^0?1[3578]\d-?\d{4}-?\d{4}$/"; if(preg_match($pattern,$mobile)){ return true; } return false;}$mobile="0173-7582-1270";$suc=isMobile($mobile);echo $suc?$mobile."手机号合法":$mobile."手机号非法";//数字规律//邮政编码//身份证号//区号//QQ号//....
定位点==^
==匹配开头\A
$ 匹配结尾\Z
\b
匹配边界\B
匹配非边界//定位点//^匹配开头//$匹配结尾$subject="This is test";$pattern='/^T/';//匹配左侧边界preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/t$/";//匹配右侧边界preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/s\b/";//匹配右侧为边界的小写字母spreg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";$pattern="/\Bs\B/";//匹配非边界小写字母spreg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
选择路径|
或,a|b
$subject="This is test";$pattern="/is|t/";//匹配is或者tpreg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
模式修饰符i
"//i"
忽略大小写$subject="This is test";$pattern="/t/i";//忽略大小写,匹配字母t//应用场景:对大小写不敏感时,使用模式修饰符i//例如:<table>或者<TABLE> 都是有效的HTML标签
U
ungreedy
非贪婪模式(懒惰模式)PHP正则默认是贪婪模式贪婪:在满足条件的前提下尽可能多的匹配可以混合使用 Ui
==.*
==贪婪模式==.*?
==非贪婪模式(量词加问号限定死)//贪婪模式$subject="<td>zhangsan</td><td>lisi</td>";$pattern="/<td>.+<\/td>/";//\转义 不然和定界符冲突/** <pre>Array( [0]=> Array ( [0]=> <td>zhangsan</td><td>lisi</td> ))</pre>*/ //贪婪模式 因为 <td>zhangsan</td><td>lisi</td> zhangsan</td><td>lisi 也满足条件下尽可能多的匹配
//非贪婪模式$pattern="/<td>.+<\/td>/U";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";/*** Array( [0]=> Array ( [0]=> zhangsan [1]=> lisi ))*/ //非贪婪模式
捕获组(XXXX)
描述正则表达式中的子表达式编号为0 的结果,匹配整个正则表达式然后从1开始,按照小括号的顺序从左向右依次排序引用正向引用在代码中(正则表达式之外)使用匹配成为正向引用反向引用语法\number
number匹配结果对应的索引值反向引用使用的是匹配结果,而不是正则表达式本身// 03_group.php// 捕获组 ()// 假定该日期是一个生日$subject="2017-12-07";// 日期格式分析:// 年: 1900-现在 (19|20)\d{2} \d{4}// 19\d{2}|200\d|201[0-7]// 月: 01 02 .... 09 10 11 12// 十位数: 0?[1-9]|1[0-2]//// 日: 01 ... 09// 10 ... 19// 20 ... 29// 30 31// 0?[1-9]|1[0-9]|2[0-9]|3[01]// 0?[1-9]|[12][0-9]|3[01]// 0?[1-9]|[12]\d|3[01]// $pattern="/(YYYY)-(MM)-(DD)/";// $pattern="/(YYYY)-((MM)-(DD))/";$pattern="/(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/";preg_match_all($pattern,$subject,$matches);echo "<pre>";print_r($matches);echo "</pre>";
(?:xxxx)
非捕获组匹配函数preg_match_all($pattern,$subject,$matches);
返回匹配的次数,二维数组
preg_match($pattern,$subject);
查找替换返回匹配的结果,一维数组
preg_replace($pattern,$replacement,$matches)
和str_replace($search,$replacement,$matches)
$subject="This is test";//将字符串中的空格替换成下划线echo str_replace(" ","_",$subject)."<hr>";$pattern="/\s/";echo preg_replace($pattern,"_",$subject)."<hr>";//声明://如果普通字符串函数与正则表达式函数能够完成同样的功能;//则优先使用普通字符串函数(正则效率低)$subject="This2 i4s te6st";//将字符串中的数字替换成下划线$pattern="/\d/";//匹配数字echo preg_replace($pattern,"_",$subject)."<hr>";//将html标签去掉//<p>hello</p>
正则分割
array pre_split($pattern,$subject)
和array explode($delimiter,$string)
$subject="This is test";$arr1=explode(" ",$subject);echo "<pre>";print_r($arr1);echo "</pre>";$pattern="/\s/";$arr1=preg_split($pattern,$subject);echo "<pre>";print_r($arr1);echo "</pre>";//声明://如果普通字符串函数与正则表达式函数能够完成同样的功能;//则优先使用普通字符串函数(正则效率低)//根据右侧边界字母s进行分割$pattern="/s\b/";$arr1=preg_split($pattern,$subject);echo "<pre>";print_r($arr1);echo "</pre>";//普通函数达不到要求,必须要正则来写了
返回匹配模式的数组条码
preg_grep($pattern,$input);
//匹配数组元素//grep=Global Regular ExPression// 全局正则表达式$pattern="/te/";$input=array("time","term","team");$arr=preg_grep($pattern,$input);echo "<pre>";print_r($arr);echo "</pre>";
为什么使用正则表达式 在这之前曾有过字符验证例子,其中验证字符的代码非常繁琐冗长。有了正则表达式,验证程序的代码变得简洁而更强大,代码运行的速度更快。为了判断某个字符串是否符合某种格式,使用正规表达的最为合适。通常,人们在表单数据发送到服务器之前,都需要进行数据合法性验证。例如,客户所填写的电子邮件地址格式是否正确等。使用正则表达式可以使程序代码简单高效 。
使用RegExp对象 RegExp是JavaScript提供的一个对象,用来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例。JavaScript使用RegExp对象封装与正则表达式相关的功能和操作,每一个该对象的实例对应着一条正则表达式。和其他对象一样,在使用之前必须取得其引用或新建一个对象实例。创建一个RegExp实例语法如下
var regObj=new RegExp(“pattern”[,”flags "] );
参数说明:pattern:必选项,正则表达式的字符串。flags:可选项,是一些标志组合。
在标志组合中,“g”表示全局标志。设定时将搜索整个字符串,以找匹配的内容,每一次新的探索都从RegExp对象的lastIndex标记的字符起,否则只搜索到第一个匹配的内容。“i”表示忽略大小写标志,若设置该项,则在搜索匹配项时忽略大小写,否则将区别大小写。以上所述是创建正则表达式对象的方式之一,另一种创建方式如下:
var regObj=/pattern/[flags];
参数的意义和第一种方式一样,但这种方式不能用引号将pattern和flags括起来。正则表达式的使用非常简单,只要用一个test方法就行了,如下所示。
regObj.test( string );
regObj表示正则表达式对象,是一个RegExp对象实例。string为源字符串,即将在其中进行匹配操作的字符串。test方法返回一个布尔值,表明是否已经在源串中找到了正则表达式所定义的模式。下面举一个例子来说明
01 <script language="javascript">02 var reg=/.o./g; // 寻找字符o前后接任意字符组成的有三个字符的字符串03 var str="How are you?" // 源串04 var result=new Array(); // 用于接收结果05 while( reg.exec(str) !=null ) // 执行匹配操作,如果找到匹配则继续找下一项06 {07 result.push( RegExp.lastMatch ); // 添加结果08 }09 alert( result ); // 输出找到的匹配项10 </script>
下一篇:lol龙女哪些皮肤有特效
发表评论