2012年9月11日 星期二

[PHP] Regular Expression 正規表示法

Compiler 必學的 Regular Expression主要可以拿來比對 pattern。在網路爬蟲 (Crawler) 的世界就更不用說啦! 訓練好怎麼利用程式語言到茫茫大海找尋你要的東西, 這是必備的技能囉!

趁學 PHP複習一下!

  • 中介字元: . , 代表任何字元
  • 跳脫字元: \ , 用以跳脫指令, 也就是真的是用該符號, e.g. \. 真的要表示 . 那個符號
  • 字元類組: [] , e.g. came, come 可用 c[ao]me 來表示, 也可用 [0-9]表示 0到9的任一數字, 同理可使用 [a-z], [A-Z] 或混用 [a-zA-Z], 另外,  若在 [] 內第一字元加上 ^, 代表除這組以外, e.g. c[^ao]me, 代表除了 came, come以外, cxme的 x可被任何字元取代, 其餘時候 ^ 就代表該符號
  • 標位點: ^: 起始, $: 結束, e.g. '^to' 代表 to開始的字串, 'be$' 代表 be結束的字串. $var = "to be or not to be" 及滿足此兩表示法. 可一起用, 以比對整個字串. $match = ereg('^Yes$', "Yes sir"); // false, 此只比對 "Yes"
  • 比較 ^在字元類組與標位點的用法
    • $var = "1234567"
    • $match = ereg("^[0-9]", $var);  // true, 比對以數字為起始的字串
    • $match = ereg("[^0-9]", $var); // false, 比對時排除數字字元
  • 前面都只比較字元, 接著是字元的重覆性
    • ? : 0或 1次(optional)
    • +: 至少一次
    • *: 0或 1次以上
    • e.g. pe?p可以表示 pep, pp, 而 pe*p則表示 pp, pep, peep, peeep, peeeee...ep
    • {n}, n代表整數, 可用來指定樣式出現的次數
  • 集結 (group) : (), 用括號表示一個小群體, e.g. (abc)+ 代表可以 abc, abcabc, abcabcabc....
  • alternative: |, 其實就是 or, e.g. $pattern='(com$|net$|gov$)' 可識別 com或 net或 gov結尾的字串
  • 中介字元 (metacharacter): e.g. \t表示定位, \n: new line, \d: 任何數字, \s表示任何留白 (space), 還有一種特殊字元以 [: xxx :]包起來, 如: [:alnum:] 可用來檢查字母
注意事項:
  • 雙引號內用 \ , 必須用兩個。e.g. $found = ereg("\\.com", "www.google.com"); 代表找 .com 這個 pattern。第二個 \ 是因為表達實際的 . 要用 \. , 而第一個 \ 是在雙引號中表達 \ 要多加 \ , 若改用單引號可避免太混亂, e.g. ereg('\.com', "www.google.com");
實用 pattern:
  • YYYY-MM-DD => $pattern = '^([0-9]{4})-([0-9]{2})-([0-9]{2})$';
  • 以單格空白取代多於空白: ereg_replace("[[:space"]]+", " ", $source);
  • 用 DD/MM/YYYY取代 YYYY-MM-DD的時間格式: 
    • $pattern = '^([0-9]{4})-([0-9]{2})-([0-9]{2})$'; 
    • print ereg_replace($pattern, '\3/\2/\1', $value);    \i 代表參照的運算式

沒有留言:

張貼留言