|
tid=16929& int preg_match_all ( string pattern, string subject, array matches [, int flags] )2 q& c/ r( L1 F) D
9 w( ]* q! D( r! K 在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。 搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。 flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義):
$ r4 v7 n, ^# K r8 yPREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。 - <?php; J0 b7 }' w" K: x. a+ k0 k) v0 i
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",/ P! V6 f2 ~3 m1 Y! ?0 J% ?
- "<b>example: </b><div align=left>this is a test</div>",4 ]# [8 } X, i% u1 |. g& [
- $out, PREG_PATTERN_ORDER);9 c" }3 s! H+ V
- print $out[0][0].", ".$out[0][1]."\n";$ X2 D: {$ k" ~2 X0 u e5 e$ r
- print $out[1][0].", ".$out[1][1]."\n";, A, w& ^# d5 a; c+ O% w7 J+ ]
- ?>
複製代碼
1 p, Y/ H2 l6 |" ~( q+ e本例將输出: - <b>example: </b>, <div align=left>this is a test</div>
" C0 s; t- R: o: K1 p - example: , this is a test
複製代碼
: m$ }/ ?: U1 F6 S, ^0 ?8 Q) \因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。 ' q* f; Y/ }/ D
3 u9 H, O6 ?; O" B. K
n2 A. w! S8 x
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。 - <?php1 E* ^0 d9 j h' ~0 i) w$ a
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
# S0 U+ x! y! O3 _! W - "<b>example: </b><div align=left>this is a test</div>",
3 O; a- a' C& ^- U - $out, PREG_SET_ORDER);$ B6 h' M, z. ^3 X2 y+ R
- print $out[0][0].", ".$out[0][1]."\n";
7 o- K& B; J$ ]* D - print $out[1][0].", ".$out[1][1]."\n";" [ y5 T w' D* y8 ]$ ?$ H/ A, k
- ?>
複製代碼 ; o7 z Y! j2 |6 b$ G/ P% A( O4 t
本例将输出: - <b>example: </b>, example:
! w3 P2 I2 \! F7 b - <div align=left>this is a test</div>, this is a test
7 \ Q' K: n8 F
複製代碼
( u, L, R: }& A8 O, ~# u本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。 PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
3 j& n0 z1 Y3 t0 l& A! u
9 `: ^7 U( }& b4 x M如果没有给出标记,则假定为 PREG_PATTERN_ORDER。 返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
' }9 N. K6 C/ ]1 {. h2 z. s% e/ e例子 1. 从某文本中取得所有的电话号码 - <?php
0 I+ [9 H: K5 D( g$ B4 ? - preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
: @4 ~2 R5 C& N" l" g( f8 o - "Call 555-1212 or 1-800-555-1212 FREE", $phones);
8 @$ F. x! s( k2 b6 h - ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy) - <?php* T. b5 I5 g! S+ [
- // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
3 B# j! D- \3 g8 i% h7 m$ A* E - // 必须匹配正则表达式本身中第二组括号内的内容,本例中2 J6 N1 z/ ?5 [7 p0 i( o
- // 就是 ([\w]+)。因为字符串在双引号中,所以需要5 J9 l5 x5 {0 y$ }' A4 k
- // 多加一个反斜线。1 H5 u, G* S6 R" H: A
- $html = "<b>bold text</b><a href=howdy.html>click me</a>";
/ y" L6 T7 _- b2 a( W
6 p9 v, a$ e% E K+ O1 c* h3 |- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);+ I7 y3 x) g! Y# f: S" L V. ]# `' T
. c; c% Z: ~' t& T! A! Q5 y- for ($i=0; $i< count($matches[0]); $i++) {
% B; L+ n$ y U! n" X0 H4 R - echo "matched: ".$matches[0][$i]."\n";
- ^% W/ z6 }8 E/ a" @ - echo "part 1: ".$matches[1][$i]."\n";
" u7 N4 t" t7 N5 B8 A& P - echo "part 2: ".$matches[3][$i]."\n";
% w) u* ?2 p' [: ?" w - echo "part 3: ".$matches[4][$i]."\n\n";
; k0 Q5 ^" o, R. y& l+ S" y - } ^+ q5 f: |' m- }# B4 s
- ?>
複製代碼本例将输出: - matched: <b>bold text</b>" M+ j" V9 A# [) D5 e$ U
- part 1: <b>2 B' ^ H, j7 t/ t; ~
- part 2: bold text& C- W8 k+ E- Z4 e+ Y; e$ \" V" M
- part 3: </b>
F/ p- T2 ~0 h7 Y" d - ( F" d L' Q+ u8 S4 z3 h8 ~6 F/ i' }
- matched: <a href=howdy.html>click me</a>
I, r7 p% y1 V/ X - part 1: <a href=howdy.html>9 N A' }0 q9 q% D# [
- part 2: click me
+ a H @/ h& \1 }2 s# I - part 3: </a>
複製代碼 . j8 d* Z% u( I! J* E# x5 g
) S% K r, d) H- T
|