正則表達式是一種具備特定模式的用來匹配文本的字符串php
preg_match 匹配css
$pattern = '/php/'; $subject = "php 是最好的編程語言,php 沒有之一!"; $result = preg_match($pattern,$subject); if($result){ echo "<h1>匹配成功</h1>"; }else{ echo "<h1>匹配不成功</h1>"; }
preg_match_all 匹配全部html
$pattern = '/php/'; $subject = "php是最好的編程語言,不會php的程序員不是好程序員!"; $result = preg_match_all($pattern,$subject,$matches); var_dump($result); var_dump($matches); //preg_match=== //int 1 //array (size=1) // 0 => string 'php' (length=3) //preg_match_all ==== //int 2 //array (size=1) // 0 => // array (size=2) // 0 => string 'php' (length=3) // 1 => string 'php' (length=3)
preg_replace 正則替換jquery
preg_filter() 等價於 preg_replace() ,但它僅僅返回與目標匹配的結果程序員
$pattern = '/www\..*\.com/'; $replacement = 'www.test.com'; $subject = [ 'www.baidu.com', 'www.google.com', 'coding.test.com' ]; $result = preg_replace($pattern,$replacement,$subject); var_dump($result); //array(3) { // [0] => // string(12) "www.test.com" // [1] => // string(12) "www.test.com" // [2] => // string(15) "coding.test.com" //} $result1 = preg_filter($pattern,$replacement,$subject); var_dump($result1); //array(2) { // [0] => // string(12) "www.test.com" // [1] => // string(12) "www.test.com" //}
正則搜索並使用回調替換web
$pattern = '/(.*)(\d{4})(-\d{2}-\d{2})/'; $subject = "今天是2020-01-14"; $result = preg_replace_callback($pattern,'nextyear',$subject); var_dump($result); function nextyear($vars){ return '明年的'.$vars[1].($vars[2]+1).$vars[3];//string(28) "明年的今天是2021-01-14" } //array (size=4) // 0 => string '今天是2020-01-14' (length=19) // 1 => string '今天是' (length=9) // 2 => string '2020' (length=4) // 3 => string '-01-14' (length=6)
PREG_GREP_INVERT 返回沒有被匹配替換到的ajax
$pattern = '/www\..*\.com/'; $subject = [ 'www.baidu.com', 'www.google.com', 'coding.imooc.com' ]; $result = preg_grep($pattern,$subject,PREG_GREP_INVERT); var_dump($result);//string(16) "coding.imooc.com"
preg_split 按照指定規則分割字符串轉數組正則表達式
$pattern = '/\||,|\s/'; $replacement = '|'; $subject = "php|asp,jsp html"; $result1 = preg_split($pattern,$subject,3); var_dump($result1); //array (size=4) // 0 => string 'php' (length=3) // 1 => string 'asp' (length=3) // 2 => string 'jsp' (length=3) // 3 => string 'html' (length=4)
轉義正則表達式字符數據庫
$str = '<a href="http://www.test.com">測試網</a>'; $result = preg_quote($str,'/'); $pattern = '/'.$result.'/'; $subject = '<a href="http://www.test.com">測試網</a>'; echo preg_match($pattern,$subject); //\<a href\="http://www\.test\.com"\>測試網\</a\>
()單獨獲取express
$pattern = '/[\da-z]+([\._\-]*[\da-z]+)*@[\da-z]+([\.\-][\da-z]+)*\.[a-z]+/i'; $subject = <<<php //imooc123@qq.com //IMOOC.123@qq.com //imooc_123@qq123.com //imooc--123@qq.com //imooc123@qq.com.cn //imooc123@vip-qq.com php; preg_match_all($pattern,$subject,$matches); var_dump($matches); //array(3) { // [0] =>//打印出全部匹配到的 // array(6) { // [0] => // string(15) "imooc123@qq.com" // [1] => // string(16) "IMOOC.123@qq.com" // [2] => // string(19) "imooc_123@qq123.com" // [3] => // string(17) "imooc--123@qq.com" // [4] => // string(18) "imooc123@qq.com.cn" // [5] => // string(19) "imooc123@vip-qq.com" // } // [1] =>//打印出第一個()裏的 // array(6) { // [0] => // string(0) "" // [1] => // string(4) ".123" // [2] => // string(4) "_123" // [3] => // string(5) "--123" // [4] => // string(0) "" // [5] => // string(0) "" // } // [2] =>//打印出第二個()裏的 // array(6) { // [0] => // string(0) "" // [1] => // string(0) "" // [2] => // string(0) "" // [3] => // string(0) "" // [4] => // string(4) ".com" // [5] => // string(3) "-qq" // } //}
ajax註冊表單案例
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="css/base.css" /> <link rel="stylesheet" type="text/css" href="css/register.css" /> <title>用戶註冊表單驗證</title> <script src="js/jquery.js"></script> </head> <body> <div class="wrapper container"> <h2>用戶註冊</h2> <form onsubmit="return post(this)"> <p class="clearfix"> <label class="one">手機號碼:</label> <input name="telphone" class="text" placeholder="請輸入手機號" /> <label class="error">請輸入正確的手機號</label> </p> <p class="clearfix"> <label class="one" >校驗碼:</label> <input name="code" class="code" type="text" placeholder="請輸入手機6位校驗碼" /> <input class="get_code" type="button" value="獲取驗證碼" /> <label class="error">請填寫手機接收到的6位數校驗碼</label> </p> <p class="clearfix"> <label class="one">登陸密碼:</label> <input name="password" type="password" class="text" placeholder="請輸入6-16位密碼" /> <label class="error">密碼在6-16個字符之間</label> </p> <p class="clearfix"> <label class="one">確認密碼:</label> <input name="c_password" type="password" class="text" placeholder="請再次輸入密碼" /> <label class="error">確認密碼和密碼不一致</label> </p> <p class="clearfix"> <label class="one">姓名:</label> <input name="name" type="text" class="text" placeholder="請輸入2-6位中文" /> <label class="error">請輸入2-6位中文</label> </p> <p class="clearfix"> <label class="one">身份證:</label> <input name="idcard" type="text" class="text" placeholder="請輸入18位二代身份證號碼" /> <label class="error">請輸入18位二代身份證號碼</label> </p> <p class="clearfix"> <label class="one">郵箱:</label> <input name="email" type="text" class="text" placeholder="請輸入Email郵箱" /> <label class="error">Email郵箱不正確</label> </p> <p class="clearfix"><input class="submit" type="submit" value="當即註冊"/></p> </form> </div> <script> function post(obj) { var postData = $(obj).serialize(); $.post('php/check.php',{postData:postData},function (data) { if(data.code){ $("input[name="+data.sign+"]").siblings('.error').show(); }else{ location.href = 'ok.html'; } },'json'); return false; } </script> </body> </html>
ok.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>註冊成功!</h1> </body> </html>
base.css
/* CSS Document */ *{margin:0; padding:0;} a{text-decoration:none; cursor:pointer;} li{list-style:none;} img{border:none;} html,body{ font-size:16px; font-family:"微軟雅黑"; overflow-x:hidden;} .wrapper{width:820px; margin:0 auto;} .left{float:left;} .right{float:right;} .clearfix:after{content:"."; display:block; clear:both; font-size:0; overflow:hidden; height:0;} .clearfix{zoom:1;} .red{color:#f93;} .mt{ margin-top:10px;} .mr{ margin-right:10px;} .mb{ margin-bottom:10px;} .ml{ margin-left:10px;} /*----header-----*/ .header{height:35px; line-height:35px; background:#5a84d1; color:#fff; font-size:14px;} .header a{color:#fff;} .weixin{position:relative; display:block; width:120px; height:38px; text-align:center;} .wx{display:inline-block; width:35px; height:35px; background:url(../img/weixinhui.png) no-repeat;} .wx:hover{background:url(../img/weixin.png) no-repeat;} .erweima{position:absolute; top:35px; left:0; display:block; width:120px; height:120px; border:1px solid #999; z-index:100;} .header .right #time{margin-left:20px;} .top{height:74px; width:1140px; margin:10px auto} /*-------logo-------*/ .logo{height:74px; margin-right:15px;} .logo a{display:block;} .slogo{width:170px; height:60px; margin-top:10px; padding-left:10px; overflow:hidden; border-left:1px solid #ccc; font-size:20px;} /*-------nav-------*/ .nav{float:right; height:30px; margin-top:30px; line-height:30px;} .nav li{float:left; position:relative; width:115px; text-align:center;} .nav li a{font-size:20px; color:#3a3a3a;} .nav li:hover > a{color:#28a7e1} .nav li:hover > ul{visibility:visible; opacity:1; } .nav li a {text-decoration:none; display:inline-block; -webkit-transition:color 0.2s linear, background 0.2s linear; -moz-transition:color 0.2s linear, background 0.2s linear; -o-transition:color 0.2s linear, background 0.2s linear; transition:color 0.2s linear, background 0.2s linear; } .subnav {visibility:hidden; opacity:0; position:absolute; top:30px; left:0; z-index:100; width:115px; text-align:center; background:rgba(0,0,0,0.4); -webkit-transition:opacity 0.2s linear, visibility 0.2s linear; -moz-transition:opacity 0.2s linear, visibility 0.2s linear; -o-transition:opacity 0.2s linear, visibility 0.2s linear; transition:opacity 0.2s linear, visibility 0.2s linear; } .subnav li{clear:both; width:100%; border:0 none;} .subnav li a{display:inline-block; color:#fff;} .subnav li:hover > a{color:#80eef5;} /*-------footer-----*/ .footer{background:#eee; padding-bottom:50px;} .footer a{color:#000;} .list1{margin:20px 15px 40px;} .list1 li{height:40px; line-height:40px;} .list1 a.first:hover{background:url(img/redIcon.png) 0 6px no-repeat;} .list1 a.first{/*float:left;*/margin-right:23px; text-indent:15px; font-weight:bold; color:#111;} .sublist li{float:left;/**/ margin-right:11px;} .sublist li a{color:#111;} .par{text-align:center;} .par a{padding:0 10px;} .footer div.right{margin:20px 25px 40px 0; } /*kefu*/ #sidekf{background:url(../img/222.png) no-repeat left bottom;width:225px; height:200px; position:fixed; _position:absolute; right:-139px;top:40px;_top:expression(documentElement.scrollTop+40);z-index:9;} #sidekf .lnk{ float:left;width:225px;} #sidekf .ovh{ float:right;width:35px; height:100px;} #sidekf a{display:block;width:128px; margin-left:97px;} .sidekf_qq1{height:33px; margin-top:35px;} .sidekf_qq2{height:36px; margin-top:3px;} .sidekf_qq3{height:36px; margin-top:3px;}
register.css
/* CSS Document */ .container{margin:5px auto; border:1px solid #D8D8D8; background: #F9F9F9; padding:50px; font-family:"微軟雅黑"} .container h2{text-align:center; color:#333;} form{margin:20px 0 0 120px;} form p{margin-bottom:10px;} form a{ color:#ff7702;} h2{ line-height:60px; font-size:30px; color:#333;} label{display:block; float:left; height:48px; line-height:48px; color:#F00; text-indent:10px;} label.one{width:90px; height:48px; text-align:right; color:#333;} input{float:left;font-size:16px; font-family:"微軟雅黑"; color:#666;} .text,.submit{border:1px solid #ccc; width:300px; height:46px; text-indent:10px;} .error{display: none;} .code{height:46px; width:180px; _line-height:46px; text-indent:10px;} .get_code{height:48px; width:110px; margin-left:10px; border:1px solid #ccc; cursor:pointer;} .agreement{margin-left:90px; height:30px; line-height:30px;font-size:12px;} .agreement input{display:block; line-height:30px; height:12px; margin:8px 8px 0 5px; border:none; width:12px; background:url(../img/checkbox.png) no-repeat; } .get_code{background:#337AB7; color:#FFF;} .submit{margin-left:90px; background:#F93; font-size:20px; letter-spacing:4px; color:#fff; cursor:pointer;} p.last{margin-left:310px; font-size:16px;} p.last input{ cursor:pointer;}
check.php
<?php parse_str($_POST['postData'],$post); if(!preg_match('/^1\d{10}$/',$post['telphone'])){ echo json_encode(['code'=>1,'sign'=>'telphone']); return ; } if($post['code']!='123456'){ echo json_encode(['code'=>1,'sign'=>'code']); return ; } if(!preg_match('/^.{6,16}$/',$post['password'])){ echo json_encode(['code'=>1,'sign'=>'password']); return ; } if($post['c_password']!=$post['password']){ echo json_encode(['code'=>1,'sign'=>'c_password']); return ; } if(!preg_match('/^[\x80-\xff]{6,18}$/',$post['name'])){ echo json_encode(['code'=>1,'sign'=>'name']); return ; } if(!preg_match('/^\d{18}$/',$post['idcard'])){ echo json_encode(['code'=>1,'sign'=>'idcard']); return ; } if(!preg_match('/^[\da-z]+([\._\-]*[\da-z]+)*@[\da-z]+([\.\-][\da-z]+)*\.[a-z]+$/',$post['email'])){ echo json_encode(['code'=>1,'sign'=>'email']); return ; } //將合法數據寫入數據庫 echo json_encode(['code'=>0]); //UTF8編碼下漢字Unicode編碼範圍:\x80-\xff //array (size=1) //'postData' => string 'telphone=111111&password=&c_password=&name=&idcard=&email=' (length=58) //array (size=6) // 'telphone' => string '111111' (length=6) // 'password' => string '' (length=0) // 'c_password' => string '' (length=0) // 'name' => string '' (length=0) // 'idcard' => string '' (length=0) // 'email' => string '' (length=0)
基礎知識補充:
在線調試工具
http://www.regexr.com/
「漢字」建議使用Unicode編碼再進行匹配
在線轉碼工具:http://tool.chinaz.com/tools/unicode.aspx
不可見原子
自定義原子
通用字符類型做原子
元字符
元字符就是指那些在正則表達式中具備特殊意義的專用字符
邊界限制符
量詞
禁止貪婪
?
當該字符緊跟在任何一個其餘限制符 (*, +, {n,}, {n,m})
後面時,匹配模式是非貪婪的。
u
模式修正符
模式單元
模式單元()的三個做用:
分組、限制多選結構、捕獲文本
反向引用
反向引用:對模式單元中捕獲的文本內容的引用
捕獲的文本存儲在臨時緩衝區中,緩衝區編號範圍爲1-99,反向引用格式爲:
\+編號
非捕獲元字符 「 ?: 」
定界符
當使用正則函數的時候,模式須要由定界符閉合包裹。
分隔符能夠使任意非字母數字、非反斜線、非空白字符。
常用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~)。
若是分隔符須要在模式內進行匹配,它必須使用反斜線進行轉義
模式修正符