php中正則表達式的匹配和數據驗證總結


  正則表達式能匹配復雜的字符串形式,比字符串處理函數功能更加多,只不過執行效率有所降低,但是可以實現非常復雜的匹配,下面總結一下

 

1、簡單的字符串匹配,判斷指定字符串是不是在另一個字符串中,和字符串查找函數差不多

1 $p = '/蘋果/';
2 $str = "我喜歡吃蘋果和香蕉";
3 if (preg_match($p, $str)) {
4     echo '匹配成功!';
5 }else{
6     echo "匹配失敗!";
7 }

可以看出preg_match()函數用來匹配正則表達式,參數依次是表達式(匹配規則),原字符串,這就是最最簡單的正則表達式了

2、忽略大小寫匹配

1 $p = '/bbc/i';
2 $str = "BBC是英國的一個電視台";
3 if (preg_match($p, $str)) {
4     echo '匹配成功!';
5 }

可以看到這個也是匹配成功的,表達式后面加i代表忽略大小寫進行匹配

3、常用的正則匹配字符串中的數據(電話號碼,姓名,郵箱、HTML數據)

 1 //匹配電話號碼
 2 $p = '/\d+\-\d+/';
 3 $str = "我的電話是010-12345678";
 4 preg_match($p, $str, $match);
 5 echo $match[0];
 6 echo "<br />";
 7 //匹配姓名
 8 $p = '/[\w\s+]:([\w\s]+)/';
 9 $str = "name:zengzhiying";
10 preg_match($p, $str, $match);
11 echo $match[1];
12 echo "<br />";
13 //匹配郵箱地址
14 $subject = "my email is yingzhi_zeng@126.com";
15 $pattern='/\w+@\w+\.\w+$/';
16 preg_match($pattern,$subject,$mathes);
17 echo $mathes[0];
18 echo "<br />";
19 //匹配HTML數據
20 $str = "<ul>
21             <li>item 1</li>
22             <li>item 2</li>
23         </ul>";
24 $p='/<li>(.*?)<\/li>/i';
25 preg_match_all($p,$str,$matches);
26 print_r($matches[1]);

這里preg_match()函數的第三個參數是匹配獲得的結果,是一個數組,如果不知道$match哪一個元素是要找的,可以先print_r試一下,然后再確定最終結果

4、獲取抓取網頁中的特定數據

  有時候我們需要抓取其他網站的某個具體數據,首先我們抓取到的是整個頁面的HTML內容,然后把它們放到字符串中,接下來我們想獲取其中某個元素中的值,這個時候就需要正則表達式進行匹配了,下面看一個案例,我們登錄網站時一般除了提交用戶名、密碼、驗證碼等數據外一般還有隱藏域,value里面有一段很長的字符串,隨着不同的客戶端會發生變化,這是為了防止一些非法操作的,如果僅僅是這樣我們可以抓取到這個數據,從而在服務器端進行模擬登錄,一樣抓取到用戶登錄后的內容,php中可以用curl發送請求來實現,現在只是抓取value屬性的值,代碼如下:

1 $data="<input type=\"hidden\" name=\"__VIEWSTATE\" value=\"shssksswHJFJNVjsuehdj28u3uej-9wj\" />";
2 $pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is';
3 preg_match_all($pattern, $data, $matches);
4 echo $matches[1][0];

這樣我們就輸出了特定數據,就是 shssksswHJFJNVjsuehdj28u3uej-9wj

5、驗證數據不能為空

有時候用戶輸入信息我們通過get或者post方式獲取,首先要確定某個變量不能是空值,這個用php內置函數empty就可以了,下面是一個簡單的函數

1 function nonempty($data){
2         if(!empty($data) || $data=='0'){
3             $isValue = true;
4     }else{
5         $isValue = false;
6     }
7     return $isValue;
8 }

 

返回值我們可以用其他值,總之方便我們使用就可以了,可以作為判斷也可以輸出信息

6、驗證郵箱格式

1 function EmailVer($email){
2      $pattern='/^[\w\.]+@\w+\.\w+$/i';
3      if(!preg_match($pattern, $email)) {
4          $ret=0;
5      }else {
6          $ret=1;
7      }
8      return $ret;
9 }

 

7、驗證手機號碼

1 function MobileVer($mobile) {
2     $pattern='/^1\d{10}$/i';
3     if(!preg_match($pattern, $mobile) {
4         $ret=0;
5     }else {
6         $ret=1;
7     }
8     return $ret;
9 }

 

8、驗證url地址(必須包含http等協議頭)

1 function UrlVer($url){
2     if(!filter_var($url,FILTER_VALIDATE_URL)){
3         return false;
4     }else{
5         return true;
6     }
7 }

 

這是php提供的內置函數驗證

 

 

9、驗證完整的域名

1 function DomainVer($url){
2     if(!preg_match('/^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?$/',$url)){
3         return false;
4     }else{
5         return true;
6     }
7 }

僅僅是域名,比如baidu.com www.baidu.com 其他就返回false,比如www.baidu.com/

 

10、驗證輸入是否為整數數字即>=0的整數

1 function Number_Ver($num){
2     if(preg_match('/^\d{1,}$/', $num)){
3         return true;
4     }else{
5         return false;
6     }
7 }

 

我們經常會遇到get或者post獲取參數值,這些值無論輸入什么默認都是字符串類型的值,所以盡管你輸入的是整數,但是php內置方法is_int還是判斷不出來的,所以上面方法可以判斷出來,並且可以判斷整形的,都可以,另外驗證負數就很簡單了,正則一改就ok了

 

發現實用的繼續補充

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM