正規表示式 @ 網頁程式 - coke750101™ :: 隨意窩 Xuite日誌
  • BlogAD
  • BloggerADs
  • 關鍵字
    1. 沒有新回應!
  • 人數即時統計
  • Google Analytics
  • Yahoo! 站長工具
  • 201203071547正規表示式

    原文網址:http://blog.roodo.com/linpapa/archives/8398099.html

     

    哪些符號是必須要被脫逸掉的特殊符號呢?

    \   +   [   ]   .   ^   $   *   ?   (   )   |

     

     

    通用式

    說明及範例

    比對不成立之字串

    /a/

    含字母 "a" 的字串,例如 "ab", "bac", "cba"

    "xyz"

    /a./

    含字母 "a" 以及其後任一個字元的字串,例如 "ab", "bac"(若要比對.,請使用 \.)

    "a", "ba"

    /^xy/

    以 "xy" 開始的字串,例如 "xyz", "xyab"(若要比對 ^,請使用 \^)

    "axy", "bxy"

    /xy$/

    以 "xy" 結尾的字串,例如 "axy", "abxy"以 "xy" 結尾的字串,例如 "axy", "abxy" (若要比對 $,請使用 \$)

    "xya", "xyb"

    [13579]

    包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy"

    "y2k"

    [0-9]

    含數字之字串

    不含數字之字串

    [a-z0-9]

    含數字或小寫字母之字串

    不含數字及小寫字母之字串

    [a-zA-Z0-9]

    含數字或字母之字串

    不含數字及字母之字串

    b[aeiou]t

    "bat", "bet", "bit", "bot", "but"

    "bxt", "bzt"

    [^0-9]

    不含數字之字串(若要比對 ^,請使用 \^)

    含數字之字串

    [^aeiouAEIOU]

    不含母音之字串(若要比對 ^,請使用 \^)

    含母音之字串

    [^\^]

    不含 "^" 之字串,例如 "xyz", "abc"

    "xy^", "a^bc"

     

    字元

    說明

    簡單範例

    \

    避開特殊字元

    /A\*/ 可用於比對 "A*",其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 "\"

    ^

    比對輸入列的啟始位置

    /^A/ 可比對 "Abcd" 中的 "A",但不可比對 "aAb"

    $

    比對輸入列的結束位置

    /A$/ 可比對 "bcdA" 中的 "A",但不可比對 "aAb"

    *

    比對前一個字元零次或更多次

    /bo*/ 可比對 "Good boook" 中的 "booo",亦可比對 "Good bk" 中的 "b"

    +

    比對前一個字元一次或更多次,等效於 {1,}

    /a+/ 可比對 "caaandy" 中的 "aaa",但不可比對 "cndy"

    ?

    比對前一個字元零次或一次

    /e?l/ 可比對 "angel" 中的 "el",也可以比對 "angle" 中的 "l"

    .

    比對任何一個字元(但換行符號不算)

    /.n/ 可比對 "nay, an apple is on the tree" 中的 "an" 和 "on",但不可比對 "nay"

    (x)

    比對 x 並將符合的部分存入一個變數

    /(a*) and (b*)/ 可比對 "aaa and bb" 中的 "aaa" 和 "bb",並將這兩個比對得到的字串設定至變數 RegExp.id="mce_marker" 和 RegExp.$2。

    xy

    比對 x 或 y

    /a*b*/g 可比對 "aaa and bb" 中的 "aaa" 和 "bb"

    {n}

    比對前一個字元 n 次,n 為一個正整數

    /a{3}/ 可比對 "lllaaalaa" 其中的 "aaa",但不可比對 "aa"

    {n,}

    比對前一個字元至少 n 次,n 為一個正整數

    /a{3,}/ 可比對 "aa aaa aaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa"

    {n,m}

    比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數

    /a{3,4}/ 可比對 "aa aaa aaaa aaaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa" 及 "aaaaa"

    [xyz]

    比對中括弧內的任一個字元

    /[ecm]/ 可比對 "welcome" 中的 "e" 或 "c" 或 "m"

    [^xyz]

    比對不在中括弧內出現的任一個字元

    /[^ecm]/ 可比對 "welcome" 中的 "w"、"l"、"o",可見出其與 [xyz] 功能相反。(同時請同學也注意 /^/ 與 [^] 之間功能的不同。)

    [\b]

    比對退位字元(Backspace character)

    可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別

    \b

    比對英文字的邊界,例如空格

    例如 /\bn\w/ 可以比對 "noonday" 中的 ‘no’ ;
    /\wy\b/ 可比對 "possibly yesterday." 中的 ‘ly’

    \B

    比對非「英文字的邊界」

    例如, /\w\Bn/ 可以比對 "noonday" 中的 ‘on’ , 
    另外 /y\B\w/ 可以比對 "possibly yesterday." 中的 ‘ye’

    \cX

    比對控制字元(Control character),其中 X 是一個控制字元

    /\cM/ 可以比對一個字串中的 control-M

    \d

    比對任一個數字,等效於 [0-9]

    /[\d]/ 可比對由 "0" 至 "9" 的任一數字但其餘如字母等就不可比對

    \D

    比對任一個非數字,等效於 [^0-9]

    /[\D]/ 可比對 "w" "a"… 但不可比對如 "7" "1" 等數字

    \f

    比對 form-feed

    若是在文字中有發生 "換頁" 的行為則可以比對成功

    \n

    比對換行符號

    若是在文字中有發生 "換行" 的行為則可以比對成功

    \r

    比對 carriage return

     

    \s

    比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]

    /\s\w*/ 可比對 "A b" 中的 "b"

    \S

    比對任一個非空白字元,等效於 [^ \f\n\r\t\v]

    /\S/\w* 可比對 "A b" 中的 "A"

    \t

    比對定位字元(Tab)

     

    \v

    比對垂直定位字元(Vertical tab)

     

    \w

    比對數字字母字元(Alphanumerical characters)或底線字母("_"),等效於 [A-Za-z0-9_]

    /\w/ 可比對 ".A _!9" 中的 "A"、"_"、"9"。

    \W

    比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]

    /\W/ 可比對 ".A _!9" 中的 "."、" "、"!",可見其功能與 /\w/ 恰好相反。

    \ooctal

    比對八進位,其中octal是八進位數目

    /\oocetal123/ 可比對與八進位的ASCII中 "123" 所相對應的字元值。

    \xhex

    比對十六進位,其中hex是十六進位數目

    /\xhex38/ 可比對與 16進位的ASCII中 "38" 所相對應的字元。



    來源已經忘記了,如果有侵犯版權麻煩請通知

    RegularExpresson基礎教學
    ^ 匹配字元串的開始
    $ 匹配字元串的結束
    ex
    "^The": 開頭一定要有"The"字元串; 
    "of despair$": 結尾一定要有"of despair" 的字元串; 
    那麼
    "^abc$": 就是要求以abc開頭和以abc結尾的字元串,實際上是只有abc匹配 
    "notice": 匹配「包含」notice的字元串 
    你可以看見如果你沒有用我們提到的兩個字符(最後一個例子),可以出現下被檢驗字元串的任何地方,你沒有把他鎖定到兩邊 

    * 相當於{0,} zero or more
    + 相當於{1,} one or more
    ? 相當於{0,1} zero or one 
    要點, '*', '+',和 '?'只管它前面那個字符.
    ex
    "ab*": 和ab{0,}同義,匹配以a開頭,後面可以接0個或者N個b組成的字元串("a", "ab", "abbb", 等); 
    "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.); 
    "ab?":和ab{0,1}同義,可以沒有或者只有一個b; 
    "a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字元串. 


    { } 限制字符出現的個數
    ex
    "ab{2}": 要求a後面一定要跟兩個b(一個也不能少)("abb"); 
    "ab{2,}": 要求a後面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.); 
    "ab{3,5}": 要求a後面可以有2-5個b("abbb", "abbbb", or "abbbbb"). 
    ( ) 幾個字符放到小括號裡
    ex
    "a(bc)*": 匹配 a 後面跟0個或者一個"bc"; 
    "a(bc){1,5}": 一個到5個 "bc." 

    還有一個字符 '│', 相當於OR 操作: 

    "hi│hello": 匹配含有"hi" 或者 "hello" 的 字元串; 
    "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字元串; 
    "(a│b)*c": 匹配含有這樣多個(包括0個)a或b,後面跟一個c 
    的字元串; 

    一個點('.')可以代表所有的單一字符,不包括"\n"
    如果,要匹配包括"\n"在內的所有單個字符,怎么辦?
    對了,用'[\n.]'這種模式.

    "a.[0-9]": 一個a加一個字符再加一個0到9的數字 
    "^.{3}$": 三個任意字符結尾 . 


    中括號括住的內容只匹配一個單一的字符 

    "[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣); 
    "[a-d]": 匹配'a' 到'd'的單個字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文
    "^[a-zA-Z]": 匹配以大小寫字母開頭的字元串 
    "[0-9]%": 匹配含有 形如 x% 的字元串 
    ",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字元串 

    你也可以把你不想要得字符列在中括號裡,你只需要在總括號裡面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號裡面有一個非字母的字元串. 
    要點:^用在中括號開頭的時候,就表示排除括號裡的字符 
    為了PHP能夠解釋,你必須在這些字符面前後加'',並且將一些字符轉義. 
    不要忘記在中括號裡面的字符是這條規路的例外─在中括號裡面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質 "[*\+?{}.]"匹配含有這些字符的字元串.
    還有,正如regx的手冊告訴我們: "如果清單裡含有 ']', 最好把它作為清單裡的第一個字符(可能跟在'^'後面). 如果含有'-', 最好把它放在最前面或者最後面, or 或者一個範圍的第二個結束點[a-d-0-9]中間的‘-’將有效. 
    看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小於m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個p
    下面說說以\開頭的
    \b 書上說他是用來匹配一個單字邊界,就是...比如've\b',可以匹配love裡的ve而不匹配very裡有ve
    \B 正好和上面的\b相反.例子我就不舉了
    .....突然想起來....可以到http://www.phpv.net/article.php/251 看看其它用\ 開頭的語法

    好,我們來做個應用:
    如何構建一個模式來匹配 貨幣數量 的輸入 
    構建一個匹配模式去檢查輸入的訊息是否為一個表示money的數字。
    我們認為一個表示money的數量有四種模式︰ "10000.00" 和 "10,000.00",或者沒有小數部分, "10000" and "10,000". 
    現下讓我們開始構建這個匹配模式: 
    ^[1-9][0-9]*$ 
    這是所變量必須以非0的數字開頭.但這也意味著 單一的 "0" 也不能透過測試. 以下是解決的方法: 
    ^(0│[1-9][0-9]*)$ 
    "只有0和不以0開頭的數字與之匹配",我們也可以允許一個負號在數字之前: 
    ^(0│-?[1-9][0-9]*)$ 
    這就是: "0 或者 一個以0開頭 且可能 有一個負號在前面的數字." 好了,現下讓我們別那麼嚴謹,
    允許以0開頭.現下讓我們放棄 負號 , 因為我們在表示錢幣的時候並不需要用到. 我們現下指定 模式 用來匹配小數部分: 
    ^[0-9]+(\.[0-9]+)?$ 
    這暗示匹配的字元串必須最少以一個阿拉伯數字開頭. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道為什麼嗎) 
    ^[0-9]+(\.[0-9]{2})?$ 
    我們上面指定小數點後面必須有兩位小數.如果你認為這樣太苛刻,你可以改成: 
    ^[0-9]+(\.[0-9]{1,2})?$ 
    這將允許小數點後面有一到兩個字符. 現下我們加上用來增加可讀性的逗號(每隔三位), 我們可以這樣表示: 
    ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ 
    不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字元串被輸入話 (為什麼?). 也不要忘記反斜杆 ’\’ 在php字元串中可能會出現錯誤 (很普遍的錯誤). 
    現下,我們已經可以確認字元串了, 我們現下把所有逗號都去掉 str_replace(",", "", $money) 然後在把類型看成 double然後我們就可以透過他做數學計算了. 

    再來一個:
    構造檢查email的正則表達式 
    在一個完整的email位址中有三個部分: 
    1. 用戶名 (在 [email]'@'[/email] 左邊的一切), 
    [email=2.]2.'@'[/email],
    3. 伺服器名(就是剩下那部分). 
    用戶名可以含有大小寫字母阿拉伯數字,句號 ('.'), 減號('-'), and 下劃線 ('_'). 伺服器名字也是符合這個規則,當然下劃線除外. 
    現下, 用戶名的開始和結束都不能是句點. 伺服器也是這樣. 還有你不能有兩個連續的句點他們之間至少存在一個字符,好現下我們來看一下怎么為用戶名寫一個匹配模式: 
    ^[_a-zA-Z0-9-]+$ 
    現下還不能允許句號的存在. 我們把它加上: 
    ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$ 
    上面的意思就是說: "以至少一個規範字符(除了.)開頭,後面跟著0個或者多個以點開始的字元串." 
    簡單化一點, 我們可以用 eregi()取代 ereg().eregi()對大小寫不敏感, 我們就不需要指定兩個範圍 "a-z" 和 "A-Z" 只需要指定一個就可以了: 
    ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$ 
    後面的伺服器名字也是一樣,但要去掉下劃線: 
    ^[a-z0-9-]+(\.[a-z0-9-]+)*$ 
    好. 現下只需要用”@”把兩部分連接: 
    ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ 

    這就是完整的email認証匹配模式了,只需要調用 
    eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil) 
    就可以得到是否為email了 
    正則表達式的其他用法 
    提取字元串 
    ereg() and eregi() 有一個特性是允許用戶透過正則表達式去提取字元串的一部分(具體用法你可以閱讀手冊). 比如說,我們想從 path/URL 提取檔案名 下面的代碼就是你需要: 
    ereg("([^\\/]*)$", $pathOrUrl, $regs); 
    echo $regs[1]; 
    進階的代換 
    ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負號都替換成逗號: 

    ereg_replace("[ \n\r\t]+", ",", trim($str));
    檢查EMAIL的正則表達式
    "^[-!#$% \'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$% \'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$% \'*+\\./0-9=?A-Z^_`a-z{|}~]+$"
    PHP的正規表達式|日誌首頁|對 MySQL 的 INSER...上一篇PHP的正規表達式下一篇對 MySQL 的 INSERT 進行效能優化 ...
    回應