|
int preg_match_all ( string pattern, string subject, array matches [, int flags] )1 V/ Z% I& T- f/ a/ q
5 \5 H, ?+ l; v' F; Z 在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義): 5 A1 t3 K- \; F& g4 r' e
PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php
! h2 |. m2 M" o. H) u- m - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
4 |9 K& i5 r) E0 c* j# \9 \3 \ U - "<b>example: </b><div align=left>this is a test</div>",
0 R$ l& F8 _0 n5 ~" S6 Q - $out, PREG_PATTERN_ORDER);
7 N6 M( L# |. X5 ]6 X! M* a - print $out[0][0].", ".$out[0][1]."\n";$ a( R6 A" M; T! h: a6 U/ t
- print $out[1][0].", ".$out[1][1]."\n";
) F( R: b' G C - ?>
複製代碼
5 ?" b; W( t; ]; f, X y1 H+ H本例將输出: - <b>example: </b>, <div align=left>this is a test</div>
: i; k! X7 M6 ] - example: , this is a test
複製代碼 & l/ ]+ W$ ~( y# Z
因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。
}* I* U+ P$ W) n; y, M
* [6 ~' j/ z. c# v- `9 ]7 ?7 E9 q; V$ [7 U
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php7 U+ _) E8 X( h d. J
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
+ N5 j, Y5 U1 w - "<b>example: </b><div align=left>this is a test</div>",
4 x* R8 I6 s$ {% } Q( V - $out, PREG_SET_ORDER);
: |/ c. Z" j0 i! y - print $out[0][0].", ".$out[0][1]."\n";9 S0 i% h" i2 x7 D8 K
- print $out[1][0].", ".$out[1][1]."\n";
+ R( h/ e7 Z8 |" `. V/ E# J5 _ - ?>
複製代碼 - v6 r& S2 b t) x. e! O8 m
本例将输出: - <b>example: </b>, example:( o7 q5 H Z- Z* K
- <div align=left>this is a test</div>, this is a test! Y% h, w- H. [( E* k n
複製代碼 1 G) H9 D9 j* S& U3 @& G! j! g
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
# W) f- f* o/ z/ n7 W. A
4 k! m. s/ l' t. O如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
5 X: ^0 e r1 l- t例子 1. 从某文本中取得所有的电话号码 - <?php z% T/ T, K5 D* }4 y1 l
- preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
4 c- |0 s/ |. Q# L. M - "Call 555-1212 or 1-800-555-1212 FREE", $phones);
+ G( W) U4 r6 W( E6 O' h - ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php
9 J: B; K( V7 a9 c - // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
% L J- i! s7 D - // 必须匹配正则表达式本身中第二组括号内的内容,本例中
, S2 M9 o' _, Z1 p: S1 \ - // 就是 ([\w]+)。因为字符串在双引号中,所以需要+ h9 b1 Y9 G! h# O
- // 多加一个反斜线。
% w6 Q" f* g; g# _6 \( ~ - $html = "<b>bold text</b><a href=howdy.html>click me</a>";+ V- n2 I( V: W0 S; w
% F+ a [6 a9 t) z- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);& |6 n4 g- Q H* B) }7 v
p- v: u; w1 y, u0 k- b8 d- for ($i=0; $i< count($matches[0]); $i++) {6 f' u k& K5 g; E
- echo "matched: ".$matches[0][$i]."\n";
. n8 J# f! `- h6 f8 b; @' M - echo "part 1: ".$matches[1][$i]."\n"; x4 ], Q, M% q
- echo "part 2: ".$matches[3][$i]."\n";
+ p+ O; [' C6 ?9 G - echo "part 3: ".$matches[4][$i]."\n\n";
9 v, W5 D: A* H1 l; I: S* L7 l - }2 R, M/ D9 G2 A( y1 w1 D7 z
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>
# ]7 h& ^8 S* B- e' U - part 1: <b>
* I2 A! j9 G: {5 m2 b - part 2: bold text
7 U/ ^) Y9 |9 c* G7 ~& w; N3 v - part 3: </b>& N' O, h6 _! u c0 I2 |1 c2 Q
( U- p+ t3 |. U! u! x+ ]5 t0 y- matched: <a href=howdy.html>click me</a>- L$ ^9 n( K6 ~4 I8 F8 i
- part 1: <a href=howdy.html>
2 |7 u5 g( A* F4 C7 W8 @' b - part 2: click me( a8 a6 r- Q" O0 e' Z3 z
- part 3: </a>
複製代碼
. ^* g9 k& N+ ]( ^" W3 \7 s7 g
# v( t" Q& _$ R; e0 n |
|