cncml手绘网

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

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

/ `2 _6 k7 N# r
strtr()的用法:
  1. <?php
    0 Q: _' g9 S  z

  2. 7 s' I6 a) k1 J2 Y
  3. $str = "test";% P9 s4 \5 }1 {( U( v) W
  4. 2 ?0 s) l, `1 d
  5. $str1 = strtr($str, 't', 'z'); // zesz& J( k* O* j2 @0 f
  6. $str2 = strtr($str, 'tt', 'z1');// 1es1/ f  e# {- V6 p0 ~! m
  7. $str3 = strtr($str, 't', '');// test
    * c! ]' ~" ]1 K. [. Y4 t: T
  8. $str4 = strtr($str, 'ts', '12');// 1e211 A+ S3 p+ K: c- Y3 p/ r
  9. 0 j/ w$ r+ y/ t0 ^, G6 k) r% `
  10. & k" d. I* N' M0 P; f3 u  ~% I
  11. $str5 = strtr($str, array("t" => '')); // es
    & l( X$ o( a( S# a
  12. $str6 = strtr($str, array("e" => 'www', "s" => "hhh"));// twwwhhht
复制代码
: q2 E5 L9 }! D$ u, |6 x+ }9 g
  有两种传递参数的格式,一种是数组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

+ |6 Z, d9 a2 ^2 V* ]% V
str_replace()的用法:  mixed str_replace ( mixed $search , mixed $replace , mixed $subject)
  1. <?php
    # p* O, x3 D" H; m) ^  R
  2. ! Q% O7 E/ l) U. t; v; m
  3. $str = "test";6 i3 g6 q9 V1 P, H

  4. / K0 Y+ w  _% `; x- X; R
  5. $str1 = str_replace('t', '', $str);// es
    - c  i/ p- S$ X( K
  6. $str2 = str_replace('es', 't', $str);// ttt
    7 a$ ~5 F5 G5 D; [

  7. % V7 C! K* z8 k$ x: [" |6 p
  8. $str3 = str_replace(array('t', 'sa'), array('a', 'b'), $str);// aeb# b3 l2 w" {8 o/ [& W
  9. $str4 = str_replace(array('t', 'sa'), array('a'), $str);// ae
    * D( X/ x9 e4 B" F; u' c) p
  10. $str5 = str_replace(array('t'), array('a', 'b'), $str);// aesa
    1 w# |2 P2 N! j& i% P" o
  11. $str6 = str_replace(array('t', 's'), 'e', $str);// eeee3 A! r2 T2 l; n5 q/ \% N" i, Q6 @
  12. : p& \2 U9 w+ B# L& _& X
  13. $arr = array(
    " ~; {6 [# H6 B. I2 Y
  14.      'a' => 'testa',
      C% g$ S( b5 W: ]1 Q7 L0 b
  15.      'b' => 'testb',9 g- c0 \5 w: T0 H
  16.      'c' => array(
    ) o) q+ T: I0 W0 E$ v5 T
  17.          'ca' => 'tes1',8 i2 U5 K9 f7 F. n* ^5 n
  18.          'cb' => 'tes2',
    , @2 I! M- U) T0 {) `
  19.      ),: d% i# k. D) c6 _4 j+ W
  20. );# f* s' `! `7 B) ~) E  h0 s; }
  21. 9 _  B$ G6 @/ {: k
  22. $arr1 = str_replace('es', 't', $arr);6 \5 e- E& d' ~, ]: r
  23. /**  E: \6 \8 N4 |+ L" p( u
  24. $arr1 = array(
    4 t1 @& |" p& E8 [" ^# i) L
  25.      'a' => 'ttta',1 {4 Z( W  O9 H% ^" E
  26.      'b' => 'tttb',3 m8 l; M* U6 d, I& S" K
  27.      'c' => array(2 p5 H8 S: F# |1 X2 F4 \8 U
  28.          'ca' => 'tes1',6 ^; v+ b/ p+ g0 x
  29.          'cb' => 'tes2',6 `- i! n- f1 n2 D
  30.      ),% q6 _' f8 k& e% l' B( s
  31. );/ h, |6 }- W+ T
  32.   *
    7 t$ G, z( [+ [5 C! |, e2 n
  33.   *" @+ H: M% ?4 S4 N
  34.   */
复制代码
2 e$ {7 B- G: ~1 m2 ~  k: H

" [3 {: Z3 ?# E  K
. q4 z5 L0 e5 Y
str_replace()在使用上比较简单:
  字符串上的使用,replace直接替换掉search,注意这里就不是字符对应,是俩参数字符串对应(区别于strtr()函数)。
  数组上的使用(值得一提的是:前一个对应元素替换完得到的结果再应用到下一个对应元素【会发现第9行的sa被替换成空了,而sa是第一步替换完得到的子串】。):
search和replace都是数组的时候:如果是两个数组元素个数相等,各个参数对应(如第8行)。如果search个数大于replace的话,多余的就被空字符串替换(如第9行)。
search是数组,replace是字符串的话,就是字符串中出现的数组各个值被被replace替换(如第11行)。
比较意外的用法:str_replace()可以处理数组的值,结果也返回数组。。这个就可以免去程序员手动循环数组了,经测试,只能对一维数组生效(如第22行)。
4 U, G# A; @8 i  t: T( A
substr_replace()用于替换字符串的子串。使用方法:是指定处理字符串的开始和长度,然后替换掉这段区间。也可以替换数组。。
  mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )
举个例子:
  1. <?php
      U# H2 p1 w+ X  B0 j3 f
  2. * O$ E0 m9 ]" q+ d& T3 c
  3. $str = "test";
    $ Q  e2 ]! Q: s5 `% Y; |% O
  4. ( L1 U0 p6 ^1 P* s
  5. echo substr_replace($str, 'zzz', 1, 2);// tzzzt
    ) x( x$ X% R8 x: x8 z1 w* d, J' ?

  6. + w  E: L# X* p1 X' `
  7. $arr = array(3 G: a$ Y" S& P" a3 N5 ~# {8 U# g
  8.      'a' => 'what',* n# N* k* k& N  `0 c' s- g: U
  9.      'b' => 'are',
    . B0 G  \6 L- @. v8 s
  10.      'c' => array(1 V7 D3 U! ~9 R* d- l
  11.          'ca' => '11',0 Z! K' ~" Z- ^0 T" g
  12.          'cb' => '22',
      q. o. X1 {% H8 q6 J$ Y6 h
  13.      ),: u9 R' H0 G6 e6 d( s
  14. );
    + |$ y( c$ [) X4 ~  D% E5 ^
  15. ' I2 x- ]9 L  ~
  16. $arr1 = substr_replace($arr, 'ok', 0, 1);2 M) G; y" W, [2 M. f# a' A5 A
  17. /**
    2 E' ]5 Z8 ^' X* e2 N' F
  18. $arr1 = array(! E, k" O" B6 H2 P6 z
  19.      'a' => 'okhat',+ M  ]5 B( w9 u0 F; O0 a$ K
  20.      'b' => 'okre',
    ; ~: K0 U5 \, b! P; h) E; |
  21.      'c' => 'okarry'" ^0 W8 O, v, L3 \2 R9 G
  22. );
    + s" x6 X( A; n( b
  23.   */+ `& ~! ^: \; T0 Q# a0 b
复制代码

2 z8 K" K5 Z, _0 a& k. w3 i: ~
数组替换的时候,也是处理一维数组的字符串值。。

0 x8 N3 U+ U8 r( [; G1 i3 v# U7 Q
preg_replace()的用法
正则这个就尼玛太强大了,主要用于匹配特定格式的时候,否则推荐直接使用str_replace()函数。
这就举个稍微简单的例子,一段话中间夹杂着一个手机号码(简单匹配,就是以1开头的11位数字,前后不能是数字),想要在手机号码前边加上( mobile: )字样。
  1. <?php
    ! t/ J5 r  Z# g1 `* ?5 J. l
  2. ) s. Y7 U- }8 q, ~3 b
  3. $arr = array(
    " E/ M+ S6 t; U% x0 e
  4.     'a' => 'XXX25012349999XXX',// 不是以1开头
    / r, N# l9 Q7 i" ^& p
  5.     'b' => 'XXX13188887777XXX',
    4 M1 O. Y% a+ l& _& s( J
  6.     'c' => 'XXXX918811113333XXXXX',  K, x- k7 ~3 W' U; H# m0 B
  7.     'd' => 'XXXX188111133331XXXXX',
    " B1 e& [3 c! |8 C/ s
  8. );
    # J: `5 b3 v2 v

  9. & U+ [) A, f4 b/ }3 `1 o3 T2 C: ^5 f
  10. $re = preg_replace('/([^0-9])(1\d{10})([^0-9])/', '$1 mobile:$2 $3', $arr);// 利用$1,$3
    * L% N( w0 q5 w: Z9 d: M2 u

  11. : n- S* a4 X" U- V5 d3 M; S& U- D4 X
  12. $re1 = preg_replace('/(?<=[^0-9])(1\d{10})(?=[^0-9])/', ' mobile:$1 ', $arr);// 使用向前向后匹配,直接匹配的$1电话号
      ^' _6 Q& S( b  k

  13. . I: N/ m8 M+ p/ Q+ d; x# l" O
  14. /**, g- V" x# @! G0 |: n; H" h
  15. Array
    $ k( E4 [  S  s! ~# K1 {/ Z
  16. (
    ) t7 m: _2 c5 T! N) |1 P
  17. [a] => XXX25012349999XXX  v5 Y0 ?4 J9 @. U- O* {' S
  18. [b] => XXX mobile:13188887777 XXX' a; \( G9 S* r2 n" X4 {8 p
  19. [c] => XXXX918811113333XXXXX3 s0 t$ ~. r# N" A/ |9 V, D, D$ l
  20. [d] => XXXX188111133331XXXXX
    7 S+ W0 h' k- g
  21. )
    / {' D, c* C& j  q/ e( Z. z
  22. **/
复制代码
" _. _" C2 `8 R

8 G9 L, i2 D  h2 Z8 l" m




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