|
tid=16929& int preg_match_all ( string pattern, string subject, array matches [, int flags] )# k; e# [) T3 h7 m. p9 ]2 D* p1 ^
3 P a& \; n6 V. k f
在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義): + A! \; Y# E% x# r4 ]; ]3 `
PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php- h% n2 ^( [3 z
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",% X% R) l f% }7 D# s
- "<b>example: </b><div align=left>this is a test</div>",
" V ]' ?: N3 ~' [% l6 q - $out, PREG_PATTERN_ORDER);
2 w' ?3 y* S( o, c* x2 f% y5 Y - print $out[0][0].", ".$out[0][1]."\n";
' l2 }9 R; A, h( }) T4 ?3 D' d - print $out[1][0].", ".$out[1][1]."\n";
, P9 z9 U2 H7 @& _- X - ?>
複製代碼
8 g. a. E# e' F) e7 d+ s本例將输出: - <b>example: </b>, <div align=left>this is a test</div>
* _. C; q# ]+ O2 v, b- i) e0 q - example: , this is a test
複製代碼 - q" I7 ~: t- J5 ?3 ^' T( d
因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。 # h" y* r6 X' V; }; c4 K# D
2 I3 h9 V- e6 T' @# g3 A! A
5 k r4 J z. N- A2 V
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php, M s) `# Z) B! b ?8 T
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",( D2 b, W# S! E3 u. O) l* H0 t
- "<b>example: </b><div align=left>this is a test</div>",
) S$ l! i, i) c8 g0 r, H8 j - $out, PREG_SET_ORDER);/ T* [& m( t* s5 S% C' u5 H
- print $out[0][0].", ".$out[0][1]."\n";
4 g6 [. K7 h% G3 D- q; }3 v- V - print $out[1][0].", ".$out[1][1]."\n";! y$ y! z ~ Y6 t3 Z9 J; C" }8 k
- ?>
複製代碼 : ]; j9 P- \ ^3 f' d
本例将输出: - <b>example: </b>, example:
+ G. r8 }0 |) d1 F2 @% E - <div align=left>this is a test</div>, this is a test
1 H2 B8 a2 Q) I2 ?: M6 f
複製代碼
2 j o5 _, E; S( j _( ]% K本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。 " v2 B5 G0 m# ?: |' h5 Y( H
& w6 g9 V v7 z5 O4 ]; o9 Y9 u) K
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
) Q, }4 n6 W" w& m' a( u% q$ U例子 1. 从某文本中取得所有的电话号码 - <?php
& {( x8 Y J; A3 Q) q1 Z- v - preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
5 X4 C7 ]3 g: ~ - "Call 555-1212 or 1-800-555-1212 FREE", $phones);
+ d* r; r' U0 m; c# B* ?+ y) E - ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php
; A4 p$ a+ x# `' j/ K - // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
% f; F1 D+ H! h; K4 c2 y. [ - // 必须匹配正则表达式本身中第二组括号内的内容,本例中5 Y; }* @- \, r% l' A* ?# X
- // 就是 ([\w]+)。因为字符串在双引号中,所以需要3 b0 p* H& \* e4 p9 N; s
- // 多加一个反斜线。
' z6 `/ K' w% b- F& D* N& v - $html = "<b>bold text</b><a href=howdy.html>click me</a>";' W/ l9 |! p. b/ C
- 7 |7 ^1 e7 i z; y" b9 l% P. g+ j5 Y
- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
, A+ k" @) J$ B8 y. M - 2 I- H5 m9 }6 m( c( y2 S: D
- for ($i=0; $i< count($matches[0]); $i++) {
& R) S0 C4 @8 J% K+ M+ b) A; c - echo "matched: ".$matches[0][$i]."\n";/ B# K$ B/ l! [- D( _: Q
- echo "part 1: ".$matches[1][$i]."\n";
! f' E7 d5 t0 G6 `$ D - echo "part 2: ".$matches[3][$i]."\n";
" {. V9 `* s ?; m0 f5 n$ M7 A - echo "part 3: ".$matches[4][$i]."\n\n";+ q/ `2 F( }6 a
- }
! H9 [' \; t4 r- J/ Q - ?>
複製代碼本例将输出: - matched: <b>bold text</b>+ b T, o1 B5 c! p5 b
- part 1: <b>2 O L6 D, n ]1 p
- part 2: bold text
! H+ ?0 _7 H& \, s) R - part 3: </b>
& J% l. _; N4 y
2 ]& ~4 S6 O$ _: m- matched: <a href=howdy.html>click me</a>; [! i4 m; F- V$ e) `& k
- part 1: <a href=howdy.html>8 m$ N1 X: w3 Z/ _: o. B
- part 2: click me4 Z7 f1 f/ e0 D8 E- \
- part 3: </a>
複製代碼
: {# T2 M4 L+ I0 V. s' D( z
# S* ]# W- M* b' u! r |