2014年8月12日 星期二

php regular expression

http://www.regular-expressions.info/php.html

http://www.rexegg.com/regex-php.html

http://webcheatsheet.com/php/regular_expressions.php





PHP正則表達式-使用preg_match()過濾字串

在網頁程式撰寫的時候,經常需要把使用者輸入的字串做過濾
但有些時候並非惡意攻擊字串
可能使用者只是輸入錯誤
因此我們需要做一些基本的檢查來預防和提式
下面是使用 preg_match() 這個函數來檢查字串的方式

首先先簡單介紹一下 preg_match() 這個函數的用法

    preg_match( 正則表達式 , 要比對的字串 , 比對結果)

其中比對結果是一個陣列,其中陣列結果是 $result[0]=原字串、$result[1]=第一個符合規則的字串、$result[2]=第二個符合規則的字串...以此類推

比對結果則回傳 1(正確) 或是 0(錯誤)

下面是一個簡單的範例

        if(preg_match($regex, $resource , $result)) {

            echo "OK";

        } else {

            echo "error";

        }


另外附上幾個常用的表達式

       //A. 檢查是不是數字

       $standard_A = "/^([0-9]+)$/";

       //B. 檢查是不是小寫英文

       $standard_B = "/^([a-z]+)$/";

       //C. 檢查是不是大寫英文

       $standard_C = "/^([A-Z]+)$/";

       //D. 檢查是不是全為英文字串

       $standard_D = "/^([A-Za-z]+)$/";

       //E. 檢查是不是英數混和字串

       $standard_E = "/^([0-9A-Za-z]+)$/";

       //F. 檢查是不是中文

       $standard_F = "/^([\x7f-\xff]+)$/";

       //G. 檢查是不是電子信箱格式

       //$standard_G_1 這組正則允許 "stanley.543-ok@myweb.com"

       //但 $standard_G_2 僅允許 "stanley543ok@myweb.com" ,字串內不包含 .(點)和 -(中線)

       $standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";

       $standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;

       //下面則是個簡單的範例,大家可以嘗試看看



       $string = "stanley.543-ok@myweb.com" ;

       $standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";

       $standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;

       function checkString($strings, $standard){

           if(preg_match($standard, $strings, $hereArray)) {

              return 1;

           } else {

              return 0;

           }

       }

       echo checkString($string, $standard_G_1);

       echo "<br>";

       echo checkString($string, $standard_G_2);







preg_match 進行正則表示式比對資料


int preg_match ( string pattern, string subject [, array matches [, int flags]] )

程式會在 string subject 中進行比對是否有符合 string pattern 條件的結果

很多人剛開始使用 preg_match 都蠻不了解其正規的用法,其實就算不完全了解正規的用法也是可以了解 preg_match 初階的使用方式,基本觀念就是給一個字串讓 preg_match 去幫你比對出符合條件的部分,透過幾個範例應該就能上手。

範例一、用 preg_match 單純的找出是否符合條件

if (preg_match("/1/i", "12345")) {
    echo "條件符合";
} else {
    echo "條件不符合";
}

這個範例會顯示條件符合。其中 i 表示不區分大小寫。

範例二、用 preg_match 找出完全符合的字母

if (preg_match("/\bdef\b/i", "abcdefg")) {
 echo "條件符合";
} else {
 echo "條件不符合";
}

這個範例會顯示條件不符合。其中 \b 所代表的意思是完全符合才算數,也就是說字串 abcdefg 中必須要有獨立的 def 才算符合,以目前狀況來說 abcdefg 全部黏在一起,所以並不符合,我們可以做個修改

if (preg_match("/\bdef\b/i", "abc def g")) {
 echo "條件符合";
} else {
 echo "條件不符合";
}

這樣子就會輸出條件符合囉!

範例三、用 preg_match 找出網址的部分

preg_match('@^(?:http://)?([^/]+)@i',"http://www.webtech.tw", $matches);
$host = $matches[1].'';
echo   $host;

這樣會輸出 www.webtech.tw,preg_match 先比對條件符合的結果,再把他放到 matches 陣列中,如果你輸出 matches 陣列會看到這樣

Array ( [0] => http://www.webtech.tw [1] => www.webtech.tw ) 

接著我們再利用 preg_match 去取得 webtech.tw 這樣的結果

preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo $matches[0];

這樣就順利找到咱們的 domain name 囉!








沒有留言:

張貼留言

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。