tid=16929& int preg_match_all ( string pattern, string subject, array matches [, int flags] )# u; W1 h- m* o" ?$ S: x* z4 T* U$ R& W
3 \" \, d. w- g5 O+ {
在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義): - i! V# f* ?. r$ Z5 p1 d
PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php9 s* X4 X5 ~: I( ?- k
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
! ?7 W% Q4 m" S" c: U6 |7 D4 U4 ? - "<b>example: </b><div align=left>this is a test</div>",
M. O9 g/ O3 v$ K" Y; |5 l - $out, PREG_PATTERN_ORDER);' M7 _4 H5 q+ X& h
- print $out[0][0].", ".$out[0][1]."\n";
) v; u! o ] N8 @1 I: b0 J% [ - print $out[1][0].", ".$out[1][1]."\n";
& n+ l: \4 d: {4 p, O - ?>
複製代碼 # A: N, r# W- `: S
本例將输出: - <b>example: </b>, <div align=left>this is a test</div>
/ j2 |4 [/ A% F( M! m' z( O - example: , this is a test
複製代碼
" H, \) m4 ^' i7 }因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。
8 M; {$ w9 o% _) M8 |3 d, x) k( \. n I! P7 v
! S( L$ x, q: k- |
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php. n3 w' `+ W {! t/ Q
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
7 t, i2 Q" u; X2 j - "<b>example: </b><div align=left>this is a test</div>",% Y! \+ u. Y: F# o
- $out, PREG_SET_ORDER);; g S8 B" \/ H( L7 q. W" N+ f
- print $out[0][0].", ".$out[0][1]."\n";) l6 @5 B/ I; n/ [8 D) G+ \) ]; p
- print $out[1][0].", ".$out[1][1]."\n";
# f# [) _4 t6 y( C - ?>
複製代碼 + D2 R; F- \+ p
本例将输出: - <b>example: </b>, example:; z U/ z7 b/ a! s. `, X# z# o3 [
- <div align=left>this is a test</div>, this is a test/ L; G G. N4 ^% l+ s
複製代碼 5 e5 a, m' M1 S0 u) n [
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
0 E- f! \# \ H0 G8 o+ B/ J5 F' ^" X% y6 A; H, k0 @
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。 * \/ ?1 h% D j1 T6 J
例子 1. 从某文本中取得所有的电话号码 - <?php Y$ g7 J- v' M% V8 n
- preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
8 E# h5 ^/ j. ] v - "Call 555-1212 or 1-800-555-1212 FREE", $phones);
* x7 M" k" i" J1 `2 D - ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php
* ], N: t! K7 M - // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
. }# f+ N3 o" j6 b" H$ N( k0 | - // 必须匹配正则表达式本身中第二组括号内的内容,本例中 o/ \4 ^' n* ^8 B+ N$ h h& y
- // 就是 ([\w]+)。因为字符串在双引号中,所以需要
1 a9 u. _! i3 D7 P1 o - // 多加一个反斜线。
, B4 P+ V" i1 K" O/ D - $html = "<b>bold text</b><a href=howdy.html>click me</a>";
3 C6 J" |% d. M6 s" ]" J1 o7 g - : R# Q1 x* s% B
- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);! j3 g. n6 C) F5 d% v/ q n5 a
- 6 r0 Z6 W! |: ^* Y
- for ($i=0; $i< count($matches[0]); $i++) {
% O: I: r; _; G+ o" ]" o - echo "matched: ".$matches[0][$i]."\n";
& }7 Y; [+ t5 K& c; n. R1 k - echo "part 1: ".$matches[1][$i]."\n";* Q" E( m7 s- Z6 c2 f
- echo "part 2: ".$matches[3][$i]."\n";
3 H' D! L! f S& c. C - echo "part 3: ".$matches[4][$i]."\n\n";
) C7 `* `. a- i { - }5 ^9 K) I" d6 b$ f2 {
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>" J* q- J6 ~: o3 P; {+ m4 U* M
- part 1: <b>
& F; K `6 n" T1 |5 O - part 2: bold text5 G. s7 i$ C! @
- part 3: </b>
6 f8 ]% c- A+ G# g
6 S* k6 L& V9 i8 m: V- }, g- matched: <a href=howdy.html>click me</a>4 m$ G9 l) i7 m2 b+ v# M0 j I0 K
- part 1: <a href=howdy.html>- Q. y9 t3 u+ S% C
- part 2: click me
9 E" O5 ]% s9 O% g- X0 | - part 3: </a>
複製代碼 " f. R9 `5 M" K! r) O3 \
6 X9 F4 I/ e2 c0 D
|