2010年5月30日 星期日

PHP與正規表示法

正規表示法是用來比對使用者所輸入的字串規格
例如今天需要使用者輸入一筆電話號碼
要求的格式假如是 000 - 11111111
使用者假如輸入00 - 11111111,就會被事先設定的正規表示法排除
本篇介紹PHP使用正規表示法的方式
 ps.提醒:正規表示法在不同語言裡有些微不同

正規表示法範例:
/^\(?[2-9]\d{2}\)?[-\s]\d{3}-\d{4}$/

每一段正規表示法都必需要包含在 / / 裡面
若要比對確實的數字如1234,那就用/1234/
^ 代表以所要的字串規則開頭,ex. ^abc =  比對abc開頭的字串
$則代表以所要的字串規則結束
如果不加$的話,^abc 的比對也會判定abcd是對的
所以如果要做嚴格的判斷一定要加上頭尾的符號
\d 比對 0 - 9的數字的一個字元
\w 比對 a - z & A -Z & 0 - 9的一個字元
\s可以比對一個空白字元,包含Tab的跳格字元或是換行字元等
. 比對出換行字元以外的任何字元

{ }裡面可以放進最多兩個參數,作用是設定前面字元或中介符號應有的數目
例如\d{2, 4} ,表示可比對出連續2到4個數字的資料,00、111、1234都對
[]可對比出設定範圍的字元,[0-2]對比出0、1、2,[A-C]對比出A、B、C
在[]中使用^的意思表示不要符合,[^3-9]可比對出0、1、2
+表示前面的字元或中介符號應該出現一次或多次
*表示前面的字元或中介符號應該出現一次或多次或是都不要出現
?表示前面的字元或中介符號應該出現一次或是都不要出現
注意若只是想使用這類符號就必須脫逸,例如\?就可比對出?

至於PHP裡面用來做比對的函式有preg_match()
它的使用方式是preg_match($regex, $my_string)
第一個參數是正規表示法,第二個參數是要比對的目標字串
因為傳進來的類別都必須是字串,正規表示法要記得加上引號
成功就回傳true

另外一個跟正規表示法有關的函式是preg_replace()
它的使用方法是preg_replace($pattern, $replacement, $my_string)
他的功用是找出不想要的字元並將他替換成我們需要的字元
例如:
$test = preg_replace('/100[0-9]/', '100', 'I have 1000 dollars');
修正後的結果會存到$test裡,成為I have 100 dollars

PHP裡提供一個checkdnsrr()函式
他可以檢查網域名稱的正確性
在裡面以字串的方式輸入@以後的網址,例如'yahoo.com.tw'
假使網域存在時會回傳1,否則就回傳0
注意一點是這個函式在Linux上沒有問題
在windows若發生問題的話則使用以下程式碼

function win_checkdnsrr($domain, $recType = ''){
  if(!empty($domain)){
    if($recType == '')  $recType = "MX";
     exec(nslookup -type=$recType $domain", $output);
     //exe呼叫執行在伺服器上的外部程式
     foreach($output as $line){
     if(preg_match("/^$domain/", $line)){
     return true;
     }
     }
    return false;
    }
  return false;
}

結合起來的驗證用戶e-mail網址的程式如下
    if (!preg_match('/^[a-zA-Z0-9][a-zA-Z0-9\._\-&!?=#]*@/', $email)) {
      // $email is invalid because LocalName is bad
      echo '<p class="error">Your email address is invalid.</p>';
      $output_form = 'yes';
    }
    else {
      // Strip out everything but the domain from the email
      $domain = preg_replace('/^[a-zA-Z0-9][a-zA-Z0-9\._\-&!?=#]*@/', '', $email);
      // Now check if $domain is registered
      if (!checkdnsrr($domain)) {
         echo '<p class="error">Your email address is invalid.</p>';
         $output_form = 'yes';
      }
     }

沒有留言:

張貼留言