|
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
7 B% J3 c. B- T1 Z8 X* Y' f( o" \; `9 n+ u8 k% W/ p
在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義): $ Q1 M. Z7 ~# c% M& U( k
PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php+ U) B. c, I% g' |( t8 _
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",; m; }# D; u6 ?- A# t4 Y0 b
- "<b>example: </b><div align=left>this is a test</div>",
1 n. C/ c3 ]& Q; x0 o - $out, PREG_PATTERN_ORDER);5 U4 ~6 ?) M# ~3 ~& x
- print $out[0][0].", ".$out[0][1]."\n";
+ c7 w, s! n+ `2 ` - print $out[1][0].", ".$out[1][1]."\n";
$ Y7 z' @& f! E( L2 d0 ]5 e& K9 B - ?>
複製代碼
$ y: ^4 u& H7 j: `/ y) q本例將输出: - <b>example: </b>, <div align=left>this is a test</div>9 X* j% r! t, K0 X% T
- example: , this is a test
複製代碼
0 G; y% v. D; A3 ~' Q因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。 % ~' T2 U' v: u& V/ c
! O$ r& u2 j8 a+ W W3 l! ?! O4 O6 n, r' F
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php
) c- D( e; Q J" A - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
, K: P& L7 X1 i5 G) `0 e0 q - "<b>example: </b><div align=left>this is a test</div>",
' u7 T9 T1 C. t - $out, PREG_SET_ORDER);
8 N+ s8 v5 L- P' Z - print $out[0][0].", ".$out[0][1]."\n";/ S( t: w9 g% S8 D$ m% [9 M8 r
- print $out[1][0].", ".$out[1][1]."\n";
* g# S1 y2 M( x1 g3 g - ?>
複製代碼 3 R4 Z, _& n. ]4 [
本例将输出: - <b>example: </b>, example:
. u' `, Q+ q: F' c5 j- p - <div align=left>this is a test</div>, this is a test
' C4 M4 z% v& S( J
複製代碼 0 |; P& B( K3 m" ^( i5 r
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
, I) c* r8 X v6 ^7 Y, I7 L
( h, N3 M0 Z* s& t+ M. N如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。 ! t6 \9 z n, ], w! C L% |
例子 1. 从某文本中取得所有的电话号码 - <?php
- ~, N" r- s" J' O3 I - preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
2 q) w& I6 W* e- u( b, O - "Call 555-1212 or 1-800-555-1212 FREE", $phones);
8 Q# C; `- F0 {' m# O9 I - ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php
5 g: p: L4 ]8 U# K - // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
7 y8 a# C8 B) {2 i3 R4 q. o# S' S - // 必须匹配正则表达式本身中第二组括号内的内容,本例中
% x: @" u+ c% k" B - // 就是 ([\w]+)。因为字符串在双引号中,所以需要" E9 W8 u( t( _2 ^$ h
- // 多加一个反斜线。
- S& O6 P% @- e5 [6 X - $html = "<b>bold text</b><a href=howdy.html>click me</a>";
+ F' @' k# ~; u5 v
" H( L# t+ n( u7 i; K- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);& @7 ?6 Q9 [0 p% Z
! e; y9 j3 p5 j" F, Z- r+ o9 L- f- for ($i=0; $i< count($matches[0]); $i++) {
: ?, i( t! L+ t" _ - echo "matched: ".$matches[0][$i]."\n";: Q2 Z& P/ H% p+ ?3 W5 b
- echo "part 1: ".$matches[1][$i]."\n";
' K0 l" q" v+ }/ j: S7 X& W) F2 f - echo "part 2: ".$matches[3][$i]."\n";
$ W' `) o0 U( s0 u: O - echo "part 3: ".$matches[4][$i]."\n\n";* }& G4 ^" t1 g, V, O
- }( e; Q' G2 s2 i; t" f+ C$ |' `! c
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>
- _' Z2 V+ L% ?. z7 a, [* } - part 1: <b>* y/ O/ R3 f, R6 F" c- Q4 V
- part 2: bold text% Q5 \, j' n2 P. r, P, N
- part 3: </b>! o" n4 P' z* n2 M0 h2 t5 T
- & e5 h) N; x# I# ~( q# g
- matched: <a href=howdy.html>click me</a>
+ L9 z% Q" }/ n% o: q) Q - part 1: <a href=howdy.html>, n/ x4 Y9 k) I3 I8 d/ K
- part 2: click me' @3 h6 q$ _* [. u7 |
- part 3: </a>
複製代碼
8 h* d- \ P9 H* K& M/ i( _, m, H6 \
! ]; K, M8 b) G. Y |
|