int preg_match_all ( string pattern, string subject, array matches [, int flags] )0 H( i5 u# C6 Z, W
, q5 ~' S4 t C8 n3 R6 L
在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義):
2 }! _) r V( |1 wPREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php; y$ k& i- b6 g* G3 B: ~ P9 i
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",& ]7 N; g' y; j1 n
- "<b>example: </b><div align=left>this is a test</div>",
1 N6 o3 g' R0 `9 h/ ` h( k' L - $out, PREG_PATTERN_ORDER);7 c( z% k5 G& Z c
- print $out[0][0].", ".$out[0][1]."\n";
0 H, e5 m g. _5 b0 E - print $out[1][0].", ".$out[1][1]."\n";
& [) l( t0 R7 k* A* Z0 p - ?>
複製代碼 # l( B/ z' r: Y. J9 D
本例將输出: - <b>example: </b>, <div align=left>this is a test</div>* ^2 }: F; o, s4 C0 g* ~( `7 l
- example: , this is a test
複製代碼 1 e) F6 o9 z: g2 t M
因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。
0 y# n- m- i; g7 N; x
% S. u% i S8 I+ {( ?1 k2 `9 K4 z( S3 _! A: N
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php
% ], [4 c* |/ S) f7 W, v8 F. N. N - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
& d+ M" i" r: f1 g - "<b>example: </b><div align=left>this is a test</div>",% A& b/ }9 o/ m$ K5 b" ?9 T: ]$ B
- $out, PREG_SET_ORDER);3 Q- Q3 f8 n# `# W
- print $out[0][0].", ".$out[0][1]."\n";
1 I2 h6 V# M' `6 y- i8 W9 ?: d1 _- c - print $out[1][0].", ".$out[1][1]."\n";- K* v6 E& {- m" T8 ?# U. Y5 f
- ?>
複製代碼 * z: R. d9 }1 w8 y
本例将输出: - <b>example: </b>, example:# }; s9 n/ j# y
- <div align=left>this is a test</div>, this is a test1 w& {2 k8 F9 @% v6 X" D; R9 K
複製代碼
3 e( |7 \1 f8 {" p# j本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。 ; X5 J. `! c" e3 R0 X" w. u
7 ?3 N. f$ I$ g4 ^8 u如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
, P( Z3 g% ~) ~3 Q' O例子 1. 从某文本中取得所有的电话号码 - <?php
' S$ u; o! n: q# d* h, m - preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
( s$ w( |) a. _4 x - "Call 555-1212 or 1-800-555-1212 FREE", $phones);( J0 U: G$ h0 J6 `* }" _, y) p
- ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php
8 s8 x- P4 f2 u! Y# {2 O: N; a - // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是! ?/ F& d$ q5 K* c& D
- // 必须匹配正则表达式本身中第二组括号内的内容,本例中, [9 o( [- s$ C7 X8 A; i- s, H
- // 就是 ([\w]+)。因为字符串在双引号中,所以需要
, V' H2 v+ a. R+ P7 D% O - // 多加一个反斜线。' C8 v9 {3 G) m. _
- $html = "<b>bold text</b><a href=howdy.html>click me</a>";
9 [0 E1 i9 f% {/ Z; u# N( L
, Y7 m% W1 l3 [8 e4 q' m+ Y- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
4 Z4 T3 V9 a" `# w- i7 t( K# G - & }# z+ u- S' e
- for ($i=0; $i< count($matches[0]); $i++) {
( w; A8 w& Y9 V( g# n8 `/ ^- ?+ b - echo "matched: ".$matches[0][$i]."\n";
4 H$ B% R; C% l7 c# v - echo "part 1: ".$matches[1][$i]."\n";
& y# U, T, y7 u$ n! X - echo "part 2: ".$matches[3][$i]."\n";8 c \& p) O1 `) e5 y- B: w) ^7 L
- echo "part 3: ".$matches[4][$i]."\n\n";/ N, T9 S) X! E
- }3 E4 p" s( ]2 i# u6 p8 F
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>! e- G3 Z6 `3 r" E( X
- part 1: <b>
& p z5 V, S! w1 K( q5 G# |1 r - part 2: bold text
/ u8 A' x' E; H# g - part 3: </b>
' y4 T$ w( ~% D L( C: l: Q
: h* t# w! q7 h6 i- matched: <a href=howdy.html>click me</a>& W* f) j- j5 s
- part 1: <a href=howdy.html>
8 ]& V @. |( A - part 2: click me0 Q# B Z7 Q$ O. T
- part 3: </a>
複製代碼
2 g' s4 u% J1 t0 H8 H' `9 I; r
( F3 D2 @) M- C( C+ {6 B( G8 e |
|