|
tid=16929& int preg_match_all ( string pattern, string subject, array matches [, int flags] )3 X; z& y: u% D2 h/ B/ T
9 q8 P9 e7 v h0 o' S# Z 在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義):
% U7 q) b! \( K& t3 l! Z U6 `PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php
! X3 @; e+ G$ C, T7 i- ` - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",* l7 r( a S4 y: Z% G5 K. h) u
- "<b>example: </b><div align=left>this is a test</div>",5 E+ W) N: `7 \
- $out, PREG_PATTERN_ORDER);, E! }! v7 R; z S7 L* w
- print $out[0][0].", ".$out[0][1]."\n";0 U6 g: o8 j- b; l
- print $out[1][0].", ".$out[1][1]."\n";2 j2 f4 N4 r3 I$ S2 k5 Z( m! u
- ?>
複製代碼 * _- ]; E5 Y3 q/ f/ j
本例將输出: - <b>example: </b>, <div align=left>this is a test</div>
: q9 w# g! Q/ T7 a& v - example: , this is a test
複製代碼
) S4 V# Q0 X+ l1 N. [% ]/ k因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。 " @- S0 {5 G# H0 h2 o" b0 }6 h
|4 t+ H& L5 _( E( u6 f; b
; u' I% k) z. }PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php
1 \3 U1 U6 J2 E U8 B+ C# W - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",; Y! i- g" l: v) Y/ z& z
- "<b>example: </b><div align=left>this is a test</div>",& D# q# l& A/ t7 s. b) a. o9 H
- $out, PREG_SET_ORDER);# q' r1 \0 w' i& ~' l
- print $out[0][0].", ".$out[0][1]."\n";
3 \1 ^7 ?9 a0 w$ v - print $out[1][0].", ".$out[1][1]."\n";% v p1 {2 V% j
- ?>
複製代碼 * n5 R6 K& n: ?# h- N6 y0 n
本例将输出: - <b>example: </b>, example:' i- x& Z" X5 [( r* |6 c
- <div align=left>this is a test</div>, this is a test% U+ h: @ `& ~; b A
複製代碼 6 u& V ?8 v0 O6 @) K
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。 - r2 o# Z' `$ @+ q+ p) d& |
# S: F5 {, p, e4 ?
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。 7 _# _/ S* u& a- j) v4 `, g) \8 {: _" U
例子 1. 从某文本中取得所有的电话号码 - <?php; z# w! d0 H2 y3 X
- preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
4 p* p$ p5 Q! N - "Call 555-1212 or 1-800-555-1212 FREE", $phones);6 H A- [+ v; y9 f5 S/ U. g0 K6 @
- ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php( L; b- [9 a) ^' F( e! |* O
- // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
& c: T7 _: R) [5 r4 q - // 必须匹配正则表达式本身中第二组括号内的内容,本例中
" z9 W$ U) V! @$ R - // 就是 ([\w]+)。因为字符串在双引号中,所以需要
# z4 z# ~0 \8 o( Z4 e: v - // 多加一个反斜线。
" d: V. b9 a5 {9 u7 W# k" A' n2 M - $html = "<b>bold text</b><a href=howdy.html>click me</a>";6 Q U8 N- }7 T2 t( n6 e
- 0 z2 H3 f# x6 W& v7 K, I; N* P
- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);) i1 \: a# b* ~% Z- f9 P) I
" m: u4 {4 M- H, _& p- for ($i=0; $i< count($matches[0]); $i++) {: T# b9 j8 M7 B# Y
- echo "matched: ".$matches[0][$i]."\n";3 q' _ q, D7 i( H9 x/ u! m
- echo "part 1: ".$matches[1][$i]."\n";2 O+ S2 N8 m6 N9 L; l4 M
- echo "part 2: ".$matches[3][$i]."\n";
% M5 S3 g. l& \- B8 [; Z9 b$ J5 ] - echo "part 3: ".$matches[4][$i]."\n\n";( h- \; P: J F6 g
- }0 V G$ Z+ p- K+ F
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>- Q" V6 j' L: T. B. }& N3 U) v
- part 1: <b>! m6 _, l" M8 T) a e+ C7 V
- part 2: bold text
! P9 {' n0 ~8 T - part 3: </b>
* [- z$ w' P. T+ O+ s. |5 _7 m8 u
V! e& y$ w3 }( q" P- matched: <a href=howdy.html>click me</a> { X7 J" V ~ w7 E) z. J
- part 1: <a href=howdy.html>8 M( a/ |' J/ ^" e
- part 2: click me' q. Q5 L+ K1 q8 l" H
- part 3: </a>
複製代碼
9 p! h! E m4 v3 ^, g1 b& O0 ] A8 w/ e3 w, F: g! j
|