PHP字符串操作入门教程

上一篇 / 下一篇  2007-08-16 18:19:01 / 个人分类:php

热血互动门户&oq#tvU|4yl

无论哪种语言,字符串操作都是一个重要的基础,往往是简单而重要。正像人说话一样,一般有形体(图形界面),有语言(print 字符串?),显然字符串能解释更多的东西。PHP提供了大量的字符串操作函数,功能强大,使用也比较简单,详细请参看 http://cn2.php.net/manual/zh/ref.strings.php . 以下将简单的讲述它的功能和特性。
H#B/YI~{&u0弱类型
Oh;B8y Y0PHP是弱类型语言,所以其它类型的数据一般可以直接应用于字符串操作函数里,而自动转换成字符串类型,进行处理,如:热血互动门户}%I&YAp;x8h1_
PHP:  [Copy to clipboard] echo substr("1234567", 1, 3); 热血互动门户Fw$q,i,{f S

:U#]\/s|,XR5R0PHP:  [Copy to clipboard] echo substr(123456,1, 3); 
&j z iKG1t0是一样的
q~Fd%fXP0热血互动门户#LQD u8d#}0z&[Pk
定义热血互动门户Da-``3z
一般用双引号或单引号标识一个字符串。比如
$nH9V1C bM4b?9B0PHP:  [Copy to clipboard] $str = "i love u"; 热血互动门户8|/gHY([
$str = 'i love u'; 热血互动门户-Gu8IjKMI6F`

[+mw] ~8ep0它者两者是有一些区别的。后者将一切单引号的内容都会当作字符处理;前者则不然。比如热血互动门户o,}/V7y gMx/w
PHP:  [Copy to clipboard] $test = "iwind"; 热血互动门户K'cv"@1Xm+F
$str = "i love $test"; 
Lr(xq'G.B0$str1 = 'i love $test'; 热血互动门户n:}w"J$d"^|L ?3M
echo $str; //将得到 i love iwind 热血互动门户'K!s Z5N%t$d
echo $str1; //将得到 i love $test 热血互动门户P?3@7eA&q/eBV1e-e F

8TJ d+~4`-mk\0同样的以下两个例子的行为也不一样的:热血互动门户wG2G"L@G
PHP:  [Copy to clipboard] echo "i love \test"; // 将得到 i love est,已经将\t视为转义 热血互动门户)p6U Rq3DA?$E
echo 'i love \test'; // 将得到 i love \test 
+r{7Z*Z/kmxA:qg0
/g |#j9rU!DhQ!J5H%u0从而可以简单认为双引号里的内容是经过“解释”过的,单引号的是“所见即所得”的。显而易见,双引号形式的更为灵活一些,当然单引号会适用于一些特殊的场合,这里就不作阐述了。
c4rR/YnW0b0热血互动门户6z S3wFJ%lXk
输出
7m0^K5h0r}0f'XJ0PHP里的输出最常用的是echo,print.两者都不是真正的函数,而是语言构造,所以调用时不必用双括号(比如echo("test");print("test")).在输出的时候两者都可以实现赋值:热血互动门户.qV7O7zy@ skw2?
PHP:  [Copy to clipboard] echo $str="test"; //一方面输出test,一方面把"test"赋给字符串变量 $str 
G"n!n)Ay k7O,h'W0print $str="test"; 热血互动门户.v&J$aQ5CX e*E b,]aq
热血互动门户$NI-i-A#jE5e
两者除了名字不一样外,还是有其它区别的。print具有返回值,一直返回1,而echo没有,所以echo比print要快一些:
K?8[#mB"jQ#x d%m O0PHP:  [Copy to clipboard] $return = print "test"; 热血互动门户H[I8n7PH f
echo $return; // 输出1 热血互动门户E EPK4Df#pR
热血互动门户)E|&S/~-Jo(O
也正因为这个原因,print能应用于复合语句中,而echo不能:
L_6mk kt }X Il0PHP:  [Copy to clipboard] isset($str) or print "str 变量未定义"; // 将输出"str 变量未定义" 
P H&nM!VEJ&L{0isset($str) or echo "str 变量未定义";// 将提示分析错误 热血互动门户IR#C5C M5d8A*lL;c
热血互动门户%q3faBm&GI w
echo一次可输出多个字符串,而print则不可以:
"I(F5k1qIB0PHP:  [Copy to clipboard] echo "i ","love ","iwind"; // 将输出 "i love iwind" 热血互动门户$T&J'q&T4g@Wf
print "i ","love ","iwind"; // 将提示错误 热血互动门户8na#D~R~%p
热血互动门户V2|E p/`"R7B,G SS
echo,print还可以输出被称作“文档句法”的字符串,句法如:
0^7l p,w+HKU(r1w@0PHP:  [Copy to clipboard] echo <<< 标签名称 热血互动门户YL&uvo'o q8a
... 
rINnB-C I0字符串内容 热血互动门户jJzF{(qf D/V?O
... 热血互动门户 J1C J(J@ {"w
标签名称; 
D P0eqO6Fj0热血互动门户jZ A5P X1]
比如
6taDI&n-p*_^-_0PHP:  [Copy to clipboard] echo <<< test 
N#W RW\0i love iwind 
,\&@2}y6Wl0test; 
XXGm)?~ W5jY0热血互动门户 f2m$[$W P7R4`8X2Y
要注意的是语句开始和结束的两个标签名称是一样的,且后一个标签名称前不能有空白,即要顶格写。文档句法输出的内容识别变量名称和常用符号,大致形同双引号的作用。
Bn*Y#ZG5{h`0
\!vc!u*qB E[$q0输出echo,print外,PHP还提供了一些格式化字符串的函数,比如printf,sprintf,vprintf,vsprintf,在这里不作详解。
7HM_]O,aw+\;|0
?1O\EuWo0连接热血互动门户 @w}_ \
两个以上的字符串连接用"."操作符,依字符串的顺序形成新的字符串。热血互动门户"nX];M)\(Y#Y3P
PHP:  [Copy to clipboard] $str = "i " . "love " . "iwind"; 
7G] zD'W R h\T]V0这里的$str 就是 "i love iwind";字符串。当然,还可以使用 .= 操作符: 热血互动门户 D$|!HNC;w
$str = ""; // 初始化 热血互动门户#|3G EI(CX0S^i s
$str .= "i love iwind"; 
t,B7O;ahVH0热血互动门户uhg(wr4hr4IF5k
这里用到了初始化,是因为未定义变量在使用时会产生一个notice错误,""或者null可以简单地代表空字符串。
1v/`um/I!A;q/@0
:m#f ?.[9F b&@0长度热血互动门户.G&fG.X,v'a(x5n
PHP提供strlen函数来计算字符串的长度:
@Y9o1~3|Dw/?G0PHP:  [Copy to clipboard] $str = "test"; 热血互动门户mK)`%b+x-rRK
echo strlen($str); // 将输出 4 
w o:W9x0Nv3u4xy%l5z0有点奇怪的是strlen将中日等汉字以及全角字符都当作两个或四个长度计算。好在mbstring或icon两个函数可以帮助解决这个问题,比如:热血互动门户W5cA3jln
PHP:  [Copy to clipboard] $len = iconv_strlen($str, "GBK"); 
X*V8y7]-pcU+Ed0$len = mb_strlen($str, "GBK"); 热血互动门户 yR&f%s*_exW7C*fp
注:mbstring模块提供了大量的对含有多字节字符的字符串的处理函数,推荐多加应用,由于这篇文章讲的是字符串入门,所以不打算详细解说。
+r!JI:fq0\wH0
J?K+c']q Xo0分隔与连接
}9?|7x"nN/iC,M0PHP允许你把一个字符串按照一个分隔符进行分隔成一个数组,或者将一个数组组合成一个字符串。看下面的例子:
p]u i&dCeL0PHP:  [Copy to clipboard] $str = "i love iwind"; 
h,CwX+HYT0$array = explode(" ", $str); 
4Z1Qt _yH({6K H0上面的explode函数,就把$str字符串按空格字符进行分隔,结果返回一个数组 $array:array("i", "love", "iwind").与explode函数有类似功能的有:preg_split(), spliti(), split()等函数。热血互动门户n7} Bj'J;^
热血互动门户N)cln#h\5x
与此相反的,implode和join则能把一个数组结合成一个字符串,他们是具有完全相同功能的函数。热血互动门户.m(LHQq;e
PHP:  [Copy to clipboard] $array = array("i", "love", "iwind"); 
_t[`Z_$h;N,T0$str = implode(" ", $array); 热血互动门户F^*~i0I e
例中的implode函数将数组$array的每个元素用空格字符进行连接,返回一个字符串 $str: "i love iwind". 
(f$\*t:Z+~0
ZA@'QZvy#zt0裁剪
7bR Y)V)J3n$l*@kD0一个字符串首和尾,可能不是你想要的部分,就可以用trim,rtrim,ltrim等函数,分别去除一个字符串两端空格,一个字符串尾部空格,一个字符串首部空格。热血互动门户!n1@$P/r$ej-BE
PHP:  [Copy to clipboard] echo trim(" i love iwind "); // 将得到 "i love iwind" 热血互动门户WJG6`:J ~9m&r fD
echo rtrim(" i love iwind "); // 将得到 " i love iwind" 
.E QsPwO ])V0echo ltrim(" i love iwind "); // 将得到 "i love iwind " 热血互动门户 hsG5^i:}%M
其实这三个参数不仅可以去除字符串首尾的空格,还可以去除它们的第二个参数指定的字符,如:热血互动门户O(\ |4sC Z+vR/K2~
PHP:  [Copy to clipboard] echo trim(",1,2,3,4,", ","); // 将得到 1,2,3,4 两端的","号被裁掉了。 
Q9f_;a#YqS!{6r(_0热血互动门户 p Eb&D9kL [:n
有时还会看到有人使用chop这个函数,其实它是rtrim的同义函数。热血互动门户 r |LW|f0Y4_

\8OS`TK boj0大小写
_"TYgv {0对于英文字母来说,可以用strtoupper,strtolower将其转变成大写或小写。热血互动门户_vMio%gy!R#h
PHP:  [Copy to clipboard] echo strtoupper("i love iwind"); // 将得到 I LOVE IWIND 
1bJg"KZ;X0echo strtolower("I LOVE IWIND"); // 将得到 i love iwind 热血互动门户{c,R~7h&KG1|
热血互动门户Xc5S Ux^
比较热血互动门户"[k1m+Q%gP)x
一般可以用 !=, == 比较两个对象是否相等,只所以说是两个对象,是因为它们不一定全部为字符串,也可以为整型等等。比如
-C/T"j%TO5GyBx0PHP:  [Copy to clipboard] $a = "joe"; 
9@4] w [$ovO6l0$b = "jerry"; 
'| ^XJ_^$~?6M0if ($a != $b) 热血互动门户4Hmd7rP0E
热血互动门户$wD:~tU Rc@ R
echo "不相等"; 热血互动门户 H-Ju$qQ-Xu
热血互动门户 we$T'\+U7N(dH}
else 热血互动门户A"QC2i s4Y
热血互动门户/yR]$sA)\$^6\"@
echo "相等"; 热血互动门户 VWL"I5r5^
热血互动门户.Z;c$D M4qM6H!q iL
如果用 !==,===(可以看到多了一个等号)比较的话,两个对象的类型要严格相等才能返回true;否则用==,!=则会将字符串自动转换成相应的类型,以便进行比较.热血互动门户&a6`"w,K?/ct%g1V+^-k
PHP:  [Copy to clipboard] 22 == "22"; // 返回 true 
-s lv}.uvhKl022 === "22"; // 返回false 热血互动门户\3~wc2r
//正因为这样,所以我们的程序时常会发生一些想不到的"意外": 热血互动门户!q-Xr$Qp u*h
0 == "我爱你"; // 返回true 热血互动门户H:E1n^"o m`
1 == "1 我爱你";// 返回true 
&c2v(o1M;B4sv0
t [9C9P?m0PHP里还有这样一组用于字符串比较的函数:strcmp,strcasecmp,strncasecmp(), strncmp(),它们都是如果前者比后者大,则返回大于0的整数;如果前者比后者小,则返回小于0的整数;如果两者相等,则返回0.它们比较的原理与其它语言的规则都是一样的。
6uL8NV]q#o[a xa*dx0strcmp是用于区分大小写(即大小写敏感)的字符串比较:
5V h9i`J7R0PHP:  [Copy to clipboard] echo strcmp("abcdd", "aBcde"); // 返回 1 (>0), 比较的是 "b"和"B" 热血互动门户o t1?d&A p:x F

P:D5c`A+zC1CM&g0strcasecmp用于不区分大小写的字符串比较:
F\9OUwo0PHP:  [Copy to clipboard] echo strcasecmp("abcdd", "aBcde"); // 返回 -1 (<0), 比较的是"d"和"e" 热血互动门户,]LM J"H1Z3j
热血互动门户$` A;@5C lR;Uq9C8k
strncmp用于比较字符串的一部分,从字符串的开头开始比较,第三个参数,为要比较的长度:
qe{&t3\e0PHP:  [Copy to clipboard] echo strncmp("abcdd", "aBcde", 3); // 返回 1 (>0), 比较了 abc 和 aBc 热血互动门户;p!j Bm/Z Uj V%]

%A5DR$J0DN.q0strncasecmp用于不区分大小写的比较字符串的一部分,从字符串的开头开始比较,第三个参数,为要比较的长度:
(Rug!E6qw0PHP:  [Copy to clipboard] echo strncasecmp("abcdd", "aBcde", 3); // 返回 0, 比较了 abc 和 aBc,  由于不区分大小写,所以两者是相同的。
Zne.QW%bA#e0热血互动门户_UqC;Y y
还有一种情况是单单比较字符串大小,达不到我们预定的要求,比如照常理 10.gif 会比 5.gif 大,但如果应用上面几个函数,就会返回 -1,即表示 10.gif比5.gif,针对这种情况,PHP提供了两个自然对比的函数strnatcmp,strnatcasecmp:热血互动门户xPY8undHv/_-}
PHP:  [Copy to clipboard] echo strnatcmp("10.gif", "5.gif"); // 返回 1 (>0) 热血互动门户C?QA1MhQ
echo strnatcasecmp("10.GIF", "5.gif"); // 返回 1 (>0) 热血互动门户-XWI h+z{u
热血互动门户(r`2vq:Dy
替换热血互动门户V ts"^L/I4eU`
替换的意义在于将一个字符串的一部分进行改变,使之成为别外一个新的字符串,以满足新的要求。PHP里通常用str_replace("要替换的内容", "要取代原内容的字符串", "原字符串")进行替换。
&zJ@}6~4Rbzr0PHP:  [Copy to clipboard] echo str_replace("iwind", "kiki", "i love iwind, iwind said"); // 将输出 "i love kiki, kiki said" 
;T6ze8M2@yw0即将 原字符串中的所有"iwind"都替换成了"kiki".热血互动门户 _%uZ(V"A

]-IJro9y&R0str_replace是大小写敏感的,所以对你不能设想用 str_replace("IWIND", "kiki",...)替换原字符串中的"iwind".
?(y(c!TI8i$G(e"Ws0
s7s p7]/O Ta*d2Y5S s0str_replace还可以实现多对一,多对多的替换,但无法实现一对多的替换:热血互动门户c5p.O)^$r
PHP:  [Copy to clipboard] echo str_replace(array("iwind", "kiki"), "people", "i love kiki, iwind said"); 热血互动门户R*L3N#w*g;b2l*C0HqW
将会输出热血互动门户J },cHWC0m%F*o1lh
i love people, people said
o0E\4X"{i0]!H/g0第一个参数中的array("iwind", "kiki")都被替换成了"people"热血互动门户#@@B|.u"zBIRl/q

Y#m*MF7?np\)p0M3H0PHP:  [Copy to clipboard] echo str_replace(array("iwind", "kiki"), array("gentle man", "ladies"), "i love kiki, iwind said"); 热血互动门户8XBA6A|"wU%{H
输出 i love ladies, gentle man said 。也就是说第一个数组中的元素被第二个数组中的相对应的元素替换掉了,如果有一个数组比另一个数组元素数要少,那么不足的都会当作空来处理。
;n @F O9W!P0Zf0
a6acv}`9[!p;H0与此有些类似的是strtr,用法请参阅手册,它们的比较请参阅 http://diary.4kiki.net/index.php?action=info&id=372 .热血互动门户.Lz*uZvsV%[r_

+KmVV$R0} n-g} ph0此外,PHP还提供了substr_replace,实现替换一部分的字符串。语法如下:热血互动门户tA q8Y ^$@"H)\
substr_replace (原字符串, 要替代的字符串, 开始替换的位置 [, 替换的长度])热血互动门户}+KBWPd(W*E
其中,开始替换的位置从0开始计算,应该小于原字符串的长度。要替换的长度是可选的。热血互动门户nr,^#@M B Bk+bgT
PHP:  [Copy to clipboard] echo substr_replace("abcdefgh", "DEF", 3); // 将输出 "abcDEF" 热血互动门户] d'nd'D ?
echo substr_replace("abcdefgh", "DEF", 3, 2); // 将输出 "abcDEFfgh" 
7ZR c]7YC3W;jp0第一个例子中,从第三个位置(即"d")开始替换,从而把 "defgh"都替换成了“DEF”热血互动门户T+y-a!v&tx
第二个例子中,也是从第三个位置(即"d")开始替换,但只能替换2个长度,即到e,所以就把"de"替换成了"DEF".热血互动门户RB.y#?7s2x!r

oq&K.x%n$Y.}_FQ0PHP还提供了preg_replace,preg_replace_callback,ereg_replace,eregi_replace等函数应用正则表达式来完成字符串替换,用法请参考手册。
W J4}i2p+X"vbG0
1w~pU!Cb0查找与匹配
?2M:A `%u;R aR~0PHP里用于查找或者匹配或者定位的函数非常多,它们都有不同的意义。这里只讲述用得比较多的strstr,stristr.后者与前者的功能,返回值都一样,只是不区分大小写。热血互动门户zn+hB$u!q
strstr("母字符串", "子字符串")用来查找子字符串在母字符串中第一次出现的位置,并返回母字符串中从子字符串开始到母字符串结束的部分。比如
0Y9^~Vb ek:n0echo strstr("abcdefg", "e"); //将输出 "efg"
LbBS8\@7U8Y"L0如果找不到子字符串,则返回空。因为可以用来判断一个字符串中是否含有另外一个字符串:
![a` n*{"n-C0PHP:  [Copy to clipboard] $needle = "iwind"; 
,_PO*F&e1{ L&L Y4RJ0$str = "i love iwind"; 热血互动门户 y:p;t*^%|Dd,B0E
if (strstr($str, $needle)) 
Nqk*HQ{"E0
YdSd;|0FOc$z0echo "里面有 iwind"; 
G1Q,v%icje2~0
k2Xvvlb0else 热血互动门户!}IV&q7b s)Q

NL)K PM;Np0echo "里面没有 iwind"; 
\&X.~BF0
%\g"[,Y2K#\8c0将会输出"里面有 iwind" 热血互动门户:R T%o;I(H
热血互动门户-t|[Y3R
HTML相关热血互动门户7{2A LQyEP
1,htmlspecialchars($string)热血互动门户` Q,e(^#Z
这是它的最简单用法,将字符串中的一些特殊字符(顾名思义)&,',"<,>转换成它们对应的HTML实体形式:
AazQ1T#j'n`Y%^3]0PHP:  [Copy to clipboard] $str = "i love <font color=\"red\">kiki</font>, iwind said."; 
;Hn{%@/@C_`0echo htmlspecialchars($str); 热血互动门户&y;w'e[ f7C(z-B
将会输出
j6{~\2]Rn0i love &lt;font color=&quot;red&quot;&gt;kiki&lt;/font&gt;, iwind said.
1S&C H$f/r4a-v0
8_ o#q/K@6C02,htmlentities($string)热血互动门户 IuN9lvDQ@0^
将所有能转换成实体形式的字符都转换成实体形式。
5hnD(OM&U`@We0热血互动门户b0[1C ?"d*Tm+w%{m
3,html_entity_decode($string);热血互动门户 jOg8KkZ;B
PHP4.3.0以后加入的具有与htmlentities($string)相反的功能。热血互动门户}ex/Lb nr _
热血互动门户#g~h `3r
4,nl2br($string)
!q4d+Ce9t~r0将字符串中所有换行符转变成<br /> + 换行符。如:
Va,Ap]rT0PHP:  [Copy to clipboard] $str = "i love kiki,\n iwind said."; 热血互动门户A%[kT5y_hw(E
echo nl2br($str); 热血互动门户q a!^2b6T h+|,DA2L
将会输出
L.E u7]M;?)nl2b0s0i love kiki,<br />
2S4V ^c[*R0iwind said.热血互动门户*Z] gf#h/D!E0R)l V|A
热血互动门户#AeN"} wo'wU%l%K0t

-d,q qb db3n0加密
;{6\#@7H2x4J0加密字符串最常用的就是md5了,它将一个字符串转换成一个长32位的唯一的字符串。
Fm+a6wd0PHP: [Copy to clipboard] echo md5("i love iwind"); // 将输出 "2df89f86e194e66dc54b30c7c464c21c" 
}3NlS([%x%_0
j%r!r8Em R P0PHP5给md5加了第二个参数,从而使它可以输出16位的加密后的字符串。
:y/dS CZ8x/H[0
/ZD^\ L7B nn.T,C0热血互动门户7cBv*WBp({|-?
到这里,这篇字符串操作入门教程就算结束了,但上面讲的这些还只是它的冰山一角,特别是PHP5之后增加了大量的新功能,所以需要我们不断的去学习它才有可能很好的应用。热血互动门户U-eTy$oU#p-z


TAG: php 输出 替换 字符串

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-01-08  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 3044
  • 日志数: 71
  • 图片数: 2
  • 文件数: 1
  • 建立时间: 2007-01-20
  • 更新时间: 2008-02-03

RSS订阅

Open Toolbar