正則表達式能匹配復雜的字符串形式,比字符串處理函數功能更加多,只不過執行效率有所降低,但是可以實現非常復雜的匹配,下面總結一下
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了
發現實用的繼續補充
