第五招 PHP之正則表示式
定界符
界定符用來標識正則表示式的開始和結束位置,可以用斜杆(/)、花括號({})、#,筆者習慣用斜杆來標識正則表示式的位置,具體用那個看個人開發習慣。
可見原子
看得見的元素,如字母、數字、符號等。
不可見原子
看不見的元素、如空格、換行、製表符。
原子集合
. | 匹配除換行符之外的任意字元 |
\d | 匹配任意一個十進位制數字,[0-9] |
\D | 匹配任意一個非十進位制數字,[^0-9] |
\s | 匹配一個不可見原子,[\f\n\r\t\v] |
\S | 匹配一個可見原子,[^\f\n\r\t\v] |
\w | 匹配任意一個數字、字母或下劃線,[0-9a-zA-Z] |
\W | 匹配任意一個非數字、字母或下劃線,[^0-9a-zA-Z] |
原子篩選
| | 匹配兩個或者多個分支 |
[ ] | 匹配方括號中的任意一個原子 |
[^] | 匹配除方括號中的原子之外的任意字元 |
量詞
{n} | 表示前面的原子恰好出現次 |
{n,} | 表示前面的原子最少出現n次 |
{n,m} | 表示前面的原子最少出現n次,最多出現m次 |
* | 匹配0、1或者多次之前的原子{0,} |
+ | 匹配1次或者多次其之前的原子{1,} |
? | 匹配0次或者1次其之前的原子,{0,1} |
邊界控制
^ | 匹配字串開始的位置 |
$ | 匹配字串結尾的位置 |
模式單元
() | 將括號內的字元作為一個整體進行匹配 |
修正模式
U | 懶惰匹配 |
i | 忽略英文字母大小寫 |
x | 忽略空白 |
s | 讓 ‘.’ 匹配包括換行符在內的所有字元 |
常用字串函式解析
int preg_match ( string $pattern
, string $subject
[, array &$matches
[, int $flags
= 0 [, int$offset
= 0 ]]] )
pattern
要搜尋的模式,字串型別。
subject
輸入字串。
matches
如果提供了引數matches,它將被填充為搜尋結果。 $matches[0]將包含完整模式匹配到的文字, $matches[1]
將包含第一個捕獲子組匹配到的文字,以此類推。
flags
flags可以被設定為以下標記值:
PREG_OFFSET_CAPTURE
int preg_match_all ( string $pattern
, string $subject
[, array &$matches
[, int $flags
= PREG_PATTERN_ORDER
[, int $offset
= 0 ]]] )
pattern
要搜尋的模式,字串形式。
subject
輸入字串。
matches
多維陣列,作為輸出引數輸出所有匹配結果, 陣列排序通過flags指定。
flags
可以結合下面標記使用(注意不能同時使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
PREG_PATTERN_ORDER
結果排序為$matches[0]儲存完整模式的所有匹配, $matches[1] 儲存第一個子組的所有匹配,以此類推。
mixed preg_replace ( mixed $pattern
, mixed $replacement
, mixed $subject
[, int $limit
= -1 [, int &$count
]] )
pattern
要搜尋的模式。可以使一個字串或字串陣列。
可以使用一些PCRE修飾符。
replacement
用於替換的字串或字串陣列。如果這個引數是一個字串,並且pattern 是一個數組,那麼所有的模式都使用這個字串進行替換。如果pattern和replacement 都是陣列,每個pattern使用replacement中對應的 元素進行替換。如果replacement中的元素比pattern中的少, 多出來的pattern使用空字串進行替換。
replacement中可以包含後向引用\\n 或$n,語法上首選後者。 每個 這樣的引用將被匹配到的第n個捕獲子組捕獲到的文字替換。 n 可以是0-99,\\0和$0代表完整的模式匹配文字。 捕獲子組的序號計數方式為:代表捕獲子組的左括號從左到右, 從1開始數。如果要在replacement 中使用反斜線,必須使用4個("\\\\",譯註:因為這首先是php的字串,經過轉義後,是兩個,再經過 正則表示式引擎後才被認為是一個原文反斜線)。
當在替換模式下工作並且後向引用後面緊跟著需要是另外一個數字(比如:在一個匹配模式後緊接著增加一個原文數字), 不能使用\\1這樣的語法來描述後向引用。比如, \\11將會使preg_replace() 不能理解你希望的是一個\\1後向引用緊跟一個原文1,還是 一個\\11後向引用後面不跟任何東西。 這種情況下解決方案是使用${1}1。 這建立了一個獨立的$1後向引用, 一個獨立的原文1。
當使用被棄用的 e 修飾符時, 這個函式會轉義一些字元(即:'、"、 \ 和 NULL) 然後進行後向引用替換。當這些完成後請確保後向引用解析完後沒有單引號或 雙引號引起的語法錯誤(比如: 'strlen(\'$1\')+strlen("$2")')。確保符合PHP的 字串語法,並且符合eval語法。因為在完成替換後, 引擎會將結果字串作為php程式碼使用eval方式進行評估並將返回值作為最終參與替換的字串。
subject
要進行搜尋和替換的字串或字串陣列。
如果subject是一個數組,搜尋和替換回在subject 的每一個元素上進行, 並且返回值也會是一個數組。
limit
每個模式在每個subject上進行替換的最大次數。預設是 -1(無限)。
count
如果指定,將會被填充為完成的替換次數。
mixed preg_filter ( mixed $pattern
, mixed $replacement
, mixed $subject
[, int $limit
= -1 [, int &$count
]] )
如果subject是一個數組,返回一個數組, 其他情況返回一個字串。
如果沒有找到匹配或者發生了錯誤,當subject是陣列 時返回一個空陣列,其他情況返回NULL。
array preg_grep ( string $pattern
, array $input
[, int $flags
= 0 ] )
pattern
要搜尋的模式, 字串形式.
input
輸入陣列.
flags
如果設定為PREG_GREP_INVERT, 這個函式返回輸入陣列中與 給定模式pattern不匹配的元素組成的陣列.
array preg_split ( string $pattern
, string $subject
[, int $limit
= -1 [, int $flags
= 0 ]] )
pattern
用於搜尋的模式,字串形式。
subject
輸入字串
limit
如果指定,將限制分隔得到的子串最多隻有limit個,返回的最後一個 子串將包含所有剩餘部分。limit值為-1, 0或null時都代表"不限制", 作為php的標準,你可以使用null跳過對flags的設定。
flags
flags 可以是任何下面標記的組合(以位或運算 | 組合):
PREG_SPLIT_NO_EMPTY
如果這個標記被設定, preg_split() 將僅返回分隔後的非空部分。
PREG_SPLIT_DELIM_CAPTURE
如果這個標記設定了,用於分隔的模式中的括號表示式將被捕獲並返回。
PREG_SPLIT_OFFSET_CAPTURE
如果這個標記被設定, 對於每一個出現的匹配返回時將會附加字串偏移量. 注意:這將會改變返回陣列中的每一個元素, 使其每個元素成為一個由第0 個元素為分隔後的子串,第1個元素為該子串在subject 中的偏移量組成的陣列。
string preg_quote ( string $str
[, string $delimiter
= NULL
] )
str
輸入字串
delimiter
如果指定了可選引數 delimiter,它也會被轉義。這通常用於 轉義PCRE函式使用的分隔符。 / 是最常見的分隔符。