PREG_PATTERN_ORDER對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。
- <?php7 Y# U5 \4 S- G4 A
- preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
% _* J0 O0 p( O" p W - "<b>example: </b><div align=left>this is a test</div>",
2 g2 A% h6 G7 p4 t4 N0 Q4 a - $out, PREG_PATTERN_ORDER);+ F+ I G! Y0 m
- print $out[0][0].", ".$out[0][1]."\n";" S9 h- l- L6 c3 J# m5 o
- print $out[1][0].", ".$out[1][1]."\n";+ v" l" a' Y8 _2 j
- ?>
複製代碼 : f' y! Z- l2 a0 m( _
本例將输出:
- <b>example: </b>, <div align=left>this is a test</div>
0 H; E( M% I8 W/ T9 G1 E: \) U" Z+ g - example: , this is a test
複製代碼
/ S& p! ^' v$ }" Z因此,$out[0] 包含匹配整个模式的字串,$out[1] 包含一對HTML 標記之間的字串。
" B* B+ W$ u# h$ n8 g( A* V3 M: [; T: o. a
7 R# l3 r8 M/ t8 q" F+ ~/ k1 P$ p
PREG_SET_ORDER对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。
- <?php
/ V/ N, ^4 D. d+ D - preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",% T9 P- |, r; F; L6 }
- "<b>example: </b><div align=left>this is a test</div>",4 @$ U' q4 U" P: v9 z. j7 E
- $out, PREG_SET_ORDER);9 E% x, j! l7 Z
- print $out[0][0].", ".$out[0][1]."\n";/ d8 @2 ]% M: Q6 Y9 _" W
- print $out[1][0].", ".$out[1][1]."\n"; G" K8 f2 u" p$ [, v$ n1 n
- ?>
複製代碼
8 k) U$ i; y% U9 w本例将输出:
- <b>example: </b>, example:
, Y9 w3 ?( M+ }% p0 J' | - <div align=left>this is a test</div>, this is a test
- {0 M( {( h' b- e0 Q# F9 l r& W/ N* C
複製代碼 ) [ D3 O/ \( ?; i
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。
PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
( C g* O) y9 h; m/ ^
. ^) _: t( t6 D9 k2 o b5 Q4 V如果没有给出标记,则假定为 PREG_PATTERN_ORDER。
返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
. Z6 Q# ^$ s5 L y; B9 m5 q# l例子 1. 从某文本中取得所有的电话号码
- <?php
6 o& R. H* Y( Y% l+ m" ^1 M# ~ - preg_match_all ("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
9 s8 {. v, F+ G; { - "Call 555-1212 or 1-800-555-1212 FREE", $phones);7 V+ W8 Z+ y4 \/ B9 d7 R
- ?>
複製代碼例子 2. 搜索匹配的 HTML 标记(greedy)
- <?php; {. u3 Q, o* K8 k% ^; E0 d8 m
- // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
" \ R# r2 ^4 _/ f3 c$ x - // 必须匹配正则表达式本身中第二组括号内的内容,本例中! v+ l/ ]% w) i3 x" A% w! i
- // 就是 ([\w]+)。因为字符串在双引号中,所以需要: H, s6 X8 H+ z* Q$ w
- // 多加一个反斜线。
) a' e, C" M( c2 j - $html = "<b>bold text</b><a href=howdy.html>click me</a>";
% \* z) @/ E+ B9 t7 y+ @: M - : l. k/ H1 ]+ N; b8 E% t
- preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);: t3 ?4 ?+ Y/ N; g# {
! `% I1 w6 [4 Q- G# g( R# ^- for ($i=0; $i< count($matches[0]); $i++) {
2 a/ R( _ ]$ h k* Y: B - echo "matched: ".$matches[0][$i]."\n";0 ] f1 v/ h: k, y. k- G2 L
- echo "part 1: ".$matches[1][$i]."\n";
& J0 v4 ]0 \4 w4 e* C - echo "part 2: ".$matches[3][$i]."\n";
# D V7 f# Z$ j! ~ - echo "part 3: ".$matches[4][$i]."\n\n";
. K5 t6 u$ ^7 i4 l - }5 ?9 L; ?. o- i6 q/ r) i
- ?>
複製代碼本例将输出:
- matched: <b>bold text</b>
. a8 Z4 h5 z% `! X: N/ i: s - part 1: <b>
+ E+ c( @) P/ F# A: y0 E - part 2: bold text1 [: G! _* ~ a* ^
- part 3: </b>
1 c7 m8 h9 p7 X6 C9 ~; c/ ~' h
, g) b: c7 m8 d$ S6 h# g3 o- matched: <a href=howdy.html>click me</a>5 X; V4 ~4 i; Q6 H# j: ?8 C
- part 1: <a href=howdy.html>
- n: E# c( }: o, T$ B4 { - part 2: click me( A9 G& ~' B3 @9 v7 T& J5 Z
- part 3: </a>
複製代碼