Regular Expression 是一種文字的搜尋語法,可以用很簡短的語法,去搜尋文章內容的相關資料,例如我要搜尋 <div class="xx">開頭的 html 內容,就可以使用簡短的 Regular Expression 來實現,簡易的 Reg 使用方式,在之前我寫的 JS 表示法就已經介紹過了,Javascript Rrgular Expression,基本上 php 與 JS 的使用方式是大同小異,這裡要介紹一些特殊的 PHP Regular Expression 使用方式。
preg_match
preg_match 的功能很像 Javascript 的 match,不同於 Javascript 是直接回傳結果, PHP preg_match 的回傳值是 true or false ,而比對的結果是存在第三個參數,所以要記得傳入第三個參數。
- 第一個參數是 「表示法的規則」
- 第二個參數是比對的文字內容
- 第三個參數是比對結果
下面的範例,是比對一個簡單的英文單字,比對成功後,字串會存入 $result
- $text="php Regular express";
- $RegExp='/express/';
- $k=preg_match($RegExp,$text,$result);
- print_r($result); // output Array ( [0] => express )
下面的範例,則是將「部分比對成功」的字串存進 array,我們在 [a-z]+的兩邊加上括號 「(」「)」,這樣就代表這個字串要獨立存進array中,執行結果,array[0]存的是總比對成功的字串,而 array[1] 就是存入我們自已指定要擷取的字串了。
- $text="php Regular express";
- $RegExp='/php\s([a-z]+)/i';
- $k=preg_match($RegExp,$text,$result);
- print_r($result);
- //output Array ( [0] => php Regular [1] => Regular )
preg_match_all
preg_match_all 代表全文比對,類同 Javascript的 「g」:global search ,可以一次將所有比對成功的字串存到 array 。
- $text="a:get b:Regular c:express";
- $RegExp='/([a-z]):([a-z]+)/i';
- $k=preg_match_all($RegExp,$text,$result);
- print_r($result[1]);
- //印出第一組比對成功的字串
- //output Array ( [0] => a [1] => b [2] => c )
- print_r($result[2]);
- //印出第二組比對成功的字串
- //output Array ( [0] => get [1] => Regular [2] => express )
preg_split
切割字串,依表示法的規則,將字串切割成 array。
- $text="a:get b:Regular c:express";
- $RegExp='/\s/i';
- $result=preg_split($RegExp,$text);
- print_r($result);
- //Array ( [0] => a:get [1] => b:Regular [2] => c:express )
特殊用法
多行,空行比對
一般在比對字串的時候,如果碰到空行,就比對失敗,這時可以使用 「/pattern/s」,代表比對多行文字。
- $text="Regular
- php";
- $RegExp='/.+/';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //只比對到 Regular 就等了,output Array ( [0] => Regular )
- $RegExp='/.+/s';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //加了 s ,成功比對正確的文字,Array ( [0] => Regular php )
- $RegExp='/(.+|\n|\r)+/';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //或是使用 「|」 ,用 or 的方式也可以取得正確的字串。
Email 信箱比對
- $text="test@mail.com.tw";
- $RegExp='/^[\_a-z\d]+(\.[\_a-z\d]+)*@([\da-z](-[\da-z])?)+(\.[a-z]+)+$/i';
- echo preg_match($RegExp,$text);
Url 網址比對
- $text="http://www.domain.com.tw/a.php?search=test1";
- $RegExp='/^(https?:\/\/)?([\da-z\.-]+)(:[0-9]+)?([\/\w\d\-_\.\%]+)([\w\d\.\-_\%\;]+)?(\?[^\?]+)?$/';
- preg_match($RegExp,$text,$result);
- print_r($result);
Script 過瀘
- $RegExp='/<[\s]*script[^>]*>.*(<[\s]*\/[\s]*script[\s]*>)?/si';
PHP RegExp 密技
其實 RegExp 是可以斷行的,不過很少有人使用這種寫法,我覺得這種寫法還不錯使用,加上註解說明文字之後,未來會比較方便維護,其它同事也容易看得懂。
- <?php
- $RegExp = <<<REG
- {
- http:\/\/ #http://
- ([a-z0-9\.]+) #get domain
- \/
- ([^\?]+) #get path
- }x
- REG;
- $link = "http://www.yahoo.com.tw/path/category/2012/index.php";
- preg_match($RegExp, $link, $REGres);
- print_r($REGres);