52AV手機A片王|52AV.ONE

標題: php中preg_match_all 用法 [打印本頁]

作者: IT_man    時間: 2015-8-28 10:27
標題: php中preg_match_all 用法

int preg_match_all ( string pattern, string subject, array matches [, int flags] )9 h( p3 m0 t8 }
2 v) r& a" O" G4 @- M" ]

在 subject 中搜索所有與pattern 给出的正規表示式匹配的内容並將结果以 flags 指定的順序放到 matches 中。

搜索到第一个匹配項之后,接下来的搜索從上一個匹配項末尾開始。

flags 可以是下列標記的組合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起來用没有意義):

/ F& Q# B3 T4 A# O& g4 q  J
PREG_PATTERN_ORDER
對結果排序使 $matches[0] 為全部模式匹配的字串,$matches[1]為第一個括号中的子模式所匹配的字串,以此類推。
  1. <?php7 Y# U5 \4 S- G4 A
  2. preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
    % _* J0 O0 p( O" p  W
  3.     "<b>example: </b><div align=left>this is a test</div>",
    2 g2 A% h6 G7 p4 t4 N0 Q4 a
  4.     $out, PREG_PATTERN_ORDER);+ F+ I  G! Y0 m
  5. print $out[0][0].", ".$out[0][1]."\n";" S9 h- l- L6 c3 J# m5 o
  6. print $out[1][0].", ".$out[1][1]."\n";+ v" l" a' Y8 _2 j
  7. ?>
複製代碼
: f' y! Z- l2 a0 m( _
本例將输出:
  1. <b>example: </b>, <div align=left>this is a test</div>
    0 H; E( M% I8 W/ T9 G1 E: \) U" Z+ g
  2. 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] 为第二组匹配项的数组,以此类推。
  1. <?php
    / V/ N, ^4 D. d+ D
  2. preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",% T9 P- |, r; F; L6 }
  3.     "<b>example: </b><div align=left>this is a test</div>",4 @$ U' q4 U" P: v9 z. j7 E
  4.     $out, PREG_SET_ORDER);9 E% x, j! l7 Z
  5. print $out[0][0].", ".$out[0][1]."\n";/ d8 @2 ]% M: Q6 Y9 _" W
  6. print $out[1][0].", ".$out[1][1]."\n";  G" K8 f2 u" p$ [, v$ n1 n
  7. ?>
複製代碼

8 k) U$ i; y% U9 w本例将输出:
  1. <b>example: </b>, example:
    , Y9 w3 ?( M+ }% p0 J' |
  2. <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. 从某文本中取得所有的电话号码
  1. <?php
    6 o& R. H* Y( Y% l+ m" ^1 M# ~
  2. preg_match_all ("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
    9 s8 {. v, F+ G; {
  3.                 "Call 555-1212 or 1-800-555-1212 FREE", $phones);7 V+ W8 Z+ y4 \/ B9 d7 R
  4. ?>
複製代碼
例子 2. 搜索匹配的 HTML 标记(greedy)
  1. <?php; {. u3 Q, o* K8 k% ^; E0 d8 m
  2. // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
    " \  R# r2 ^4 _/ f3 c$ x
  3. // 必须匹配正则表达式本身中第二组括号内的内容,本例中! v+ l/ ]% w) i3 x" A% w! i
  4. // 就是 ([\w]+)。因为字符串在双引号中,所以需要: H, s6 X8 H+ z* Q$ w
  5. // 多加一个反斜线。
    ) a' e, C" M( c2 j
  6. $html = "<b>bold text</b><a href=howdy.html>click me</a>";
    % \* z) @/ E+ B9 t7 y+ @: M
  7. : l. k/ H1 ]+ N; b8 E% t
  8. preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);: t3 ?4 ?+ Y/ N; g# {

  9. ! `% I1 w6 [4 Q- G# g( R# ^
  10. for ($i=0; $i< count($matches[0]); $i++) {
    2 a/ R( _  ]$ h  k* Y: B
  11.   echo "matched: ".$matches[0][$i]."\n";0 ]  f1 v/ h: k, y. k- G2 L
  12.   echo "part 1: ".$matches[1][$i]."\n";
    & J0 v4 ]0 \4 w4 e* C
  13.   echo "part 2: ".$matches[3][$i]."\n";
    # D  V7 f# Z$ j! ~
  14.   echo "part 3: ".$matches[4][$i]."\n\n";
    . K5 t6 u$ ^7 i4 l
  15. }5 ?9 L; ?. o- i6 q/ r) i
  16. ?>
複製代碼
本例将输出:
  1. matched: <b>bold text</b>
    . a8 Z4 h5 z% `! X: N/ i: s
  2. part 1: <b>
    + E+ c( @) P/ F# A: y0 E
  3. part 2: bold text1 [: G! _* ~  a* ^
  4. part 3: </b>
    1 c7 m8 h9 p7 X6 C9 ~; c/ ~' h

  5. , g) b: c7 m8 d$ S6 h# g3 o
  6. matched: <a href=howdy.html>click me</a>5 X; V4 ~4 i; Q6 H# j: ?8 C
  7. part 1: <a href=howdy.html>
    - n: E# c( }: o, T$ B4 {
  8. part 2: click me( A9 G& ~' B3 @9 v7 T& J5 Z
  9. part 3: </a>
複製代碼

2 U, Z- E7 V/ m5 d, d
% P" F' v2 ?" {6 k* D' E" P




歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/) Powered by Discuz! X3.2