2012
Jan
28

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

Example
  1. $text="php Regular express";
  2. $RegExp='/express/';
  3. $k=preg_match($RegExp,$text,$result);
  4. print_r($result); // output Array ( [0] => express )

下面的範例,則是將「部分比對成功」的字串存進 array,我們在 [a-z]+的兩邊加上括號 「(」「)」,這樣就代表這個字串要獨立存進array中,執行結果,array[0]存的是總比對成功的字串,而 array[1] 就是存入我們自已指定要擷取的字串了。

Example
  1. $text="php Regular express";
  2. $RegExp='/php\s([a-z]+)/i';
  3. $k=preg_match($RegExp,$text,$result);
  4. print_r($result);
  5. //output Array ( [0] => php Regular [1] => Regular )

preg_match_all

preg_match_all 代表全文比對,類同 Javascript的 「g」:global search ,可以一次將所有比對成功的字串存到 array 。

Example
  1. $text="a:get b:Regular c:express";
  2. $RegExp='/([a-z]):([a-z]+)/i';
  3. $k=preg_match_all($RegExp,$text,$result);
  4. print_r($result[1]);
  5. //印出第一組比對成功的字串
  6. //output Array ( [0] => a [1] => b [2] => c )
  7. print_r($result[2]);
  8. //印出第二組比對成功的字串
  9. //output Array ( [0] => get [1] => Regular [2] => express )

preg_split

切割字串,依表示法的規則,將字串切割成 array。

Example
  1. $text="a:get b:Regular c:express";
  2. $RegExp='/\s/i';
  3. $result=preg_split($RegExp,$text);
  4. print_r($result);
  5. //Array ( [0] => a:get [1] => b:Regular [2] => c:express )

特殊用法

多行,空行比對

一般在比對字串的時候,如果碰到空行,就比對失敗,這時可以使用 「/pattern/s」,代表比對多行文字。

Example
  1. $text="Regular
  2. php";
  3. $RegExp='/.+/';
  4. preg_match($RegExp,$text,$result);
  5. print_r($result);
  6. //只比對到 Regular 就等了,output Array ( [0] => Regular )
  7.  
  8. $RegExp='/.+/s';
  9. preg_match($RegExp,$text,$result);
  10. print_r($result);
  11. //加了 s ,成功比對正確的文字,Array ( [0] => Regular php )
  12.  
  13. $RegExp='/(.+|\n|\r)+/';
  14. preg_match($RegExp,$text,$result);
  15. print_r($result);
  16. //或是使用 「|」 ,用 or 的方式也可以取得正確的字串。

Email 信箱比對

Example
  1. $text="[email protected]";
  2. $RegExp='/^[\_a-z\d]+(\.[\_a-z\d]+)*@([\da-z](-[\da-z])?)+(\.[a-z]+)+$/i';
  3. echo preg_match($RegExp,$text);

Url 網址比對

Example
  1. $text="http://www.domain.com.tw/a.php?search=test1";
  2. $RegExp='/^(https?:\/\/)?([\da-z\.-]+)(:[0-9]+)?([\/\w\d\-_\.\%]+)([\w\d\.\-_\%\;]+)?(\?[^\?]+)?$/';
  3. preg_match($RegExp,$text,$result);
  4. print_r($result);

Script 過瀘

Example
  1. $RegExp='/<[\s]*script[^>]*>.*(<[\s]*\/[\s]*script[\s]*>)?/si';

PHP RegExp 密技

其實 RegExp 是可以斷行的,不過很少有人使用這種寫法,我覺得這種寫法還不錯使用,加上註解說明文字之後,未來會比較方便維護,其它同事也容易看得懂。

Example
  1. <?php
  2. $RegExp = <<<REG
  3. {
  4. http:\/\/ #http://
  5. ([a-z0-9\.]+) #get domain
  6. \/
  7. ([^\?]+) #get path
  8. }x
  9. REG;
  10.  
  11. $link = "http://www.yahoo.com.tw/path/category/2012/index.php";
  12.  
  13. preg_match($RegExp, $link, $REGres);
  14.  
  15. print_r($REGres);

參考資料


回應 (Leave a comment)