標籤雲

搜尋此網誌

2008/03/13

php-POSIX正規表示式(regular expression)

php 相關 function:
int ereg ( string $pattern, string $string [, array &$regs] )
//Searches a string for matches to the regular expression given in pattern in a case-sensitive way.

string ereg_replace ( string $pattern, string $replacement, string $string )
//scans string for matches to pattern, then replaces the matched text with replacement.

array split ( string $pattern, string $string [, int $limit] )
//Splits a string into array by regular expression.

array explode ( string $delimiter, string $string [, int $limit] )
//比 split 快, 但不支援多位元

使用方法:
正規表示式須放在單引號中

字元類別: 用 [ ] 包圍, 方括符內的任一字元都算
連字元 [a-z]、[A-Z]、[0-9] 可連用如: [A-Za-z0-9], 若寫為[A-z]則也包含[]^_等字元, 但寫為[a-Z]則不合法, 因為 Z 的ASCII編碼在 a 前面
^字元, 表示互斥, 例: [^aeiou]表示除aeiou這五個字元之外的都算

POSIX 命名字元類別有:(需在字元類別內使用)
[:alnum:] --ASCII字母及數字, 相當於[A-Za-z0-9]
[:alpha:] --ASCII字母, 相當於[A-Za-z]
[:blank:] --空格及tab, 相當於[ \t]
[:space:] --空白字元(空格、換行、tab及垂直tab), 相當於[\n\r\t \x0b]
[:cntrl:] --不可列印的控制字元, 相當於[\x01-\x1f]
[:digit:] --相當於[0-9]
[:lower:] --相當於[a-z]
[:upper:] --相當於[A-Z]

邊界:
[:<:] --右邊界 [:>:] --左邊界
^ --字串開頭(元字元 metacharacter, 須在方括符外面使用)
$ --字串結尾(元字元, 須在方括符外面使用)

點號:
. 點號代表任一單一字元, 實際字串中的點號需用 \. 轉義
但是字元類別中的點號 . 就是代表點號

量詞:(quantifier)
{min, max} -- 出現的最小值與最大值
* --代表 {0,} 即 零或多
+ --代表 {1,} 即 一或多
? --代表 零或一 (可以不出現, 但若出現只能一次)

分組:
使用 ( ) 小括符將字串包圍, 但要注意使用分組則效能會較差, 可搭配序列分割符號 | 使用
例:
(very{1,})
(good|awesome|amazing)

反向引用: (back reference)
php的POSIX正規表示式中將分組命名為 \1, \2, ... , \n (其中 n 只能到 9)
\0 表示引用整個字串
例:
$replaced = ereg_replace('([%;])', '\\\1', $myString)
就將 $myString 中的 % 或 ; 符號替換成 \ 符號
(\\代表跳脫轉義的 \ 而後面的 \1 則是反向引用)

綜合範例:

[[:alnum:] _-]{6,30}
代表大小寫字母與數字還有空格, 底線, 橫線都接受, 最少6字元最大30字元

1 則留言:

匿名 提到...

非常受用的一篇關於posix regex整理,謝謝!