cncml手绘网

标题: php字符串替换的几个函数 [打印本页]

作者: admin    时间: 2019-1-22 10:01
标题: php字符串替换的几个函数
  strtr()
  str_replace()
  substr_replace()
  preg_replace()

: K9 V2 k% K7 _, {
strtr()的用法:
  1. <?php
    , a" y7 P( g" R, F! x

  2. ' @) C6 Q" F0 Q) M
  3. $str = "test";6 x% q' v+ J* Q5 A7 D3 H

  4. - z2 B  \& @# L* Y) Q2 t6 E
  5. $str1 = strtr($str, 't', 'z'); // zesz
    " x/ ]% ~3 n- R# z, T
  6. $str2 = strtr($str, 'tt', 'z1');// 1es1
    0 @, X% ^+ |3 e
  7. $str3 = strtr($str, 't', '');// test
    & B+ S2 p* F5 W; _2 N8 ]: x) b% o
  8. $str4 = strtr($str, 'ts', '12');// 1e21
    / L) n7 G" c2 M' |4 a. G( f9 Y

  9. 6 m, G& t) g$ q' n5 V( g7 |

  10. 2 K9 Q6 E+ L6 g- o( o
  11. $str5 = strtr($str, array("t" => '')); // es
    8 \( t& O$ s" ~  Z- P2 r8 B
  12. $str6 = strtr($str, array("e" => 'www', "s" => "hhh"));// twwwhhht
复制代码
) ?" N8 L1 b; h" B4 l' j
  有两种传递参数的格式,一种是数组k=>v形式,一种是两个字符串的形式。
一,字符串情况   string strtr ( string $str , string $from , string $to ):
  search参数的每个字符和replace参数的字符对应(这个是该函数用法关键)。如果search中出现相同的字符,会按照search中最后一个字符对应的replace参数的字符代替(如第6行代码)。
  如果search或者replace是空字符串,则不会被替换,原样输出(如第7行)。
二,数组k=>v情况   string strtr ( string $str , array $replace_pairs ):
  这种情况比较简单,就是把字符串中的k替换成v
: P% T3 ]/ ]9 g* x0 n
str_replace()的用法:  mixed str_replace ( mixed $search , mixed $replace , mixed $subject)
  1. <?php1 E7 Q2 P! F* T% ?: s9 T
  2. ! `, D. a2 }* U
  3. $str = "test";
    1 d! t9 h  P% z1 e* K$ B6 X* W
  4. # `" D  |, |( ]1 Y- f; P( I, F
  5. $str1 = str_replace('t', '', $str);// es7 _7 Q, G9 q* o2 r( `
  6. $str2 = str_replace('es', 't', $str);// ttt
    " X7 o) b& a2 B! e9 i. l1 q: k9 s* [4 k

  7. 1 t. W8 q5 P7 W' E; ]+ T+ C
  8. $str3 = str_replace(array('t', 'sa'), array('a', 'b'), $str);// aeb
      B* g  c! e: ~9 }9 S' d
  9. $str4 = str_replace(array('t', 'sa'), array('a'), $str);// ae
    7 Y, ~& |5 P% W
  10. $str5 = str_replace(array('t'), array('a', 'b'), $str);// aesa1 \% H6 S$ z: ?% x
  11. $str6 = str_replace(array('t', 's'), 'e', $str);// eeee
    4 L* O2 I0 l/ x$ D6 R0 Y' e

  12. ! G5 \5 ~, B4 e1 p  `5 u# A+ {( U
  13. $arr = array(
    ; V. K9 A! S& m8 N3 B4 ?3 d
  14.      'a' => 'testa',# K0 e: h; d$ @( z
  15.      'b' => 'testb',
    % S4 e. N7 M+ }, K5 q" D; E! Z
  16.      'c' => array(4 n' L$ u/ ~1 ?
  17.          'ca' => 'tes1',- Y$ `- H; F% t6 I. l: J
  18.          'cb' => 'tes2',9 s& n' z) Y) S6 |
  19.      ),3 Z* p2 c" I" T2 Z, z9 D! X
  20. );
    0 L. ~/ q) \) `+ W

  21. / k& x; X: n8 u7 o$ S
  22. $arr1 = str_replace('es', 't', $arr);
    : r, I' X5 t4 J/ N4 \* x; N
  23. /**
    ' }: L4 _) p, f
  24. $arr1 = array(
    , \, E0 \% p% b! s+ O
  25.      'a' => 'ttta',
      {( s5 q5 T1 B+ L
  26.      'b' => 'tttb',
    0 q- F7 y! m( S
  27.      'c' => array(: G2 H2 d1 o$ _
  28.          'ca' => 'tes1',  ?, {8 |: l% @0 K8 E1 ?) G0 E5 p
  29.          'cb' => 'tes2',* Y7 c2 Z7 J. f, f& A3 `
  30.      ),! ?1 w+ J) l! P; P
  31. );9 F8 \  y' F% y3 s2 N3 D, L3 ?# p0 y3 e
  32.   *+ U% l& j3 X# `
  33.   *
    # t: Q* t) V) d. N9 i9 x
  34.   */
复制代码
# c, ?! x# D2 e* B
# N: `1 m2 ]. s) L

& Y& _% H( R7 |- w0 ^1 G0 v$ T
str_replace()在使用上比较简单:
  字符串上的使用,replace直接替换掉search,注意这里就不是字符对应,是俩参数字符串对应(区别于strtr()函数)。
  数组上的使用(值得一提的是:前一个对应元素替换完得到的结果再应用到下一个对应元素【会发现第9行的sa被替换成空了,而sa是第一步替换完得到的子串】。):
search和replace都是数组的时候:如果是两个数组元素个数相等,各个参数对应(如第8行)。如果search个数大于replace的话,多余的就被空字符串替换(如第9行)。
search是数组,replace是字符串的话,就是字符串中出现的数组各个值被被replace替换(如第11行)。
比较意外的用法:str_replace()可以处理数组的值,结果也返回数组。。这个就可以免去程序员手动循环数组了,经测试,只能对一维数组生效(如第22行)。
/ h6 i' i; {$ F' K$ l2 T
substr_replace()用于替换字符串的子串。使用方法:是指定处理字符串的开始和长度,然后替换掉这段区间。也可以替换数组。。
  mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )
举个例子:
  1. <?php2 s* f9 e8 I5 {& c) N- E# M
  2. ' S+ Q& Z; \+ V* r; }
  3. $str = "test";
    ) k* `6 \. O5 \0 g! h9 B. J8 @: C
  4. # @1 d# k" w) l% M$ l$ y, K) k( `
  5. echo substr_replace($str, 'zzz', 1, 2);// tzzzt
      q$ P$ {1 o! f
  6. 2 C+ e" l! n$ ^" n6 @
  7. $arr = array(
    " z8 k& K* h+ t+ z8 @, d
  8.      'a' => 'what',
    + S8 h& p( M2 n2 i1 V3 q
  9.      'b' => 'are',
    ! n; ]( d' j( I  ]- C
  10.      'c' => array(  M" o1 y. Z: P7 c3 p* ^3 ^
  11.          'ca' => '11',
    5 J8 ?1 w! r& H
  12.          'cb' => '22',
    - G) ]* _* {5 b& W
  13.      ),+ `$ Z) ^0 L( X. K% O  u
  14. );
    . g) B' H" R7 {+ o) m$ N9 G
  15. - t$ g! Z2 j8 d9 |
  16. $arr1 = substr_replace($arr, 'ok', 0, 1);
    2 ~8 b) G6 H* P% ?3 r
  17. /**
    % p7 E: N4 U4 G# J/ n
  18. $arr1 = array(- j# u! {8 ^6 ]+ _1 a
  19.      'a' => 'okhat',5 t( x( P' a4 \: i- U. [2 J) ]- s
  20.      'b' => 'okre',7 i6 o. i* I- [% B4 A
  21.      'c' => 'okarry'
    $ k1 q4 J' C( U/ K; I
  22. );
    . t& m3 k$ F/ q0 k  a4 d8 T; E
  23.   */
    8 {- H; R* E0 e0 g+ {, ]& r! M, m. ?
复制代码
7 d9 X7 J  S8 G, G
数组替换的时候,也是处理一维数组的字符串值。。

/ ?& |' T; H/ y# E( T
preg_replace()的用法
正则这个就尼玛太强大了,主要用于匹配特定格式的时候,否则推荐直接使用str_replace()函数。
这就举个稍微简单的例子,一段话中间夹杂着一个手机号码(简单匹配,就是以1开头的11位数字,前后不能是数字),想要在手机号码前边加上( mobile: )字样。
  1. <?php
    5 t( V+ v/ w/ g% h& W) ~- _* T

  2. 2 i  i1 u# u* M- }0 O
  3. $arr = array(' L  H/ p4 Q& [9 o
  4.     'a' => 'XXX25012349999XXX',// 不是以1开头
    7 S! H8 f/ k3 m: z  K* s
  5.     'b' => 'XXX13188887777XXX',
    , \. Y7 o* b" ^* j8 d
  6.     'c' => 'XXXX918811113333XXXXX',
    ! H; J9 y! x$ f6 q; u: o. j
  7.     'd' => 'XXXX188111133331XXXXX',
    7 d0 ^& w& v; f: n) q- g
  8. );1 L) O3 w6 F. a2 X% A1 [
  9. " U  L, {6 Z. f8 l. {# ^* T
  10. $re = preg_replace('/([^0-9])(1\d{10})([^0-9])/', '$1 mobile:$2 $3', $arr);// 利用$1,$35 [/ q" e3 U/ O$ M+ j, A4 M" S

  11. # L* l# O, E" y7 @& s
  12. $re1 = preg_replace('/(?<=[^0-9])(1\d{10})(?=[^0-9])/', ' mobile:$1 ', $arr);// 使用向前向后匹配,直接匹配的$1电话号
    0 D$ t! _& l5 u6 e/ v' M

  13. 3 M6 Q; s! s) S6 ^* G
  14. /**7 i9 D$ ^' I% U* I) k& z+ X# q
  15. Array+ w" i, x# m; U# T6 q* B2 L
  16. (
      D% H* Z5 Q+ K
  17. [a] => XXX25012349999XXX
      }7 ^0 _9 O& q& c
  18. [b] => XXX mobile:13188887777 XXX8 w6 T4 d  q1 M! O
  19. [c] => XXXX918811113333XXXXX2 P( A# k: [( M* M: i' b
  20. [d] => XXXX188111133331XXXXX% M1 K8 Q0 M) [% J+ V. J9 J
  21. )
    % C3 Q' q4 o6 i" p
  22. **/
复制代码

9 c9 f1 j2 T' i5 ?% t1 b. D3 H/ e' ?/ E0 R





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2