捌玖网络工作室's Archiver

admin 发表于 2008-4-4 02:34

[Zend权威认证试题讲解]第五章 - 字符串与正则表达式

字符串是PHP的“瑞士军刀”——作为一种Web开发语言,PHP最常打交道的就是字符串。因此对于开发者来说,处理字符串是一项非常基础的技能。
LWM,y-S)R xZ g 幸运的是,由于PHP开发团队的努力,PHP对字符串的处理相当易学。你只需迈过第一个难关,接下来就一马平川了。 rb3T]%B
但是,PHP的这一部分功能并非完美。本章考验你对字符串的了理解及对处理字符串的函数的认识。此外,你还必须面对正则表达式——一个非常有用,却总是被开发者忽试的工具——的编写艺术。
T;r|U Y@7? +O9ot di@"{
,\.Qz]^ze ?,k
问题
T a R8HF D#m j
-`R)n bU&b r*M"} 1.考虑如下脚本。标记处应该添加什么代码才能让脚本输出字符串php?[code] 4t K*X:t]jPw
<?php
f$c&?&qv $alpha = 'abcdefghijklmnopqrstuvwxyz'; q0G/B,m:s5q.bN&l {n
$letters = array(15, 7, 15);
M/KJ9ON:j-EO foreach($letters as $val) {5I9L~%Xf1lz
        /* 这里应该加入什么 */_/S.G9A;zQw8f
}
ym~rxr9R'D| ?>[/code]A.echo chr($val);0H7_I)}&fk`
B.echo asc($val);POdC DS%V6h
C.echo substr($alpha, $val, 2);
wc;a m6Q;er D.echo $alpha{$val};
+]7~2Wz4L9z)o E.echo $alpha{$val+1}
r4A;I8?hma:`geTv :\*VLjO(p^ GS)B
&aOi:C)lWDY#wK
2.以下哪一项不能把字符串$s1和$s2组成一个字符串?
E| kaL!Y0B
`%B2b UR!L ~!J^ A.$s1 + $s2P4W gWer u
B."{$s1}{$s2}"!CXsz#Wo'kt}
C.$s1.$s2
+O#rb)\3V B0v D.implode('', array($s1,$s2))
i_+e`[\ E.以上都可以&u b] v1zF J*Z

}w5k7e'O.M &y4F oHU'm
3.变量$email的值是字符串[email=user@example.com][color=#006699]user@example.com[/color][/email],以下哪项能把字符串转化成example.com?
IqQ+^AV7?5r gu8|2lH,GF
A.substr($email, strpos($email, "@"));
:P]2wS-v0C'n:Y B.strstr($email, "@");
uE7OL.l| C.strchr($email, "@");
8Sz+D4e$m&~0G} D.substr($email, strpos($email, "@")+1);
$h \*W-S4c t![ E.strrpos($email, "@");$r lR~1E"h3D7K1rB }

wVh.@\c @ xwS'E
4.给定一个用逗号分隔一组值的字符串,以下哪个函数能在仅调用一次的情况下就把每个独立的值放入一个新创建的数组?
$V XF-M.[^Y)T6|$}
]\4M wQC|d A.strstr()z2bS:c%r k9]2d e9G
B.不可能只调用一次就完成
#o9p3a1\knA C.extract()}6SF"`/a
D.explode() k3qlq&dv0wu8[L#L
E.strtok()
1@q D2Ny
p5v _ f7|*W :i#l$K"dFb2N-a
5.要比较两个字符串,以下那种方法最万能?!mf rP:e7T

3v!r(LY(B%r A.用strpos函数1V)Q };su4nX
B.用==操作符
~Kqb&q'rQl T A C.用strcasecmp()/Kn2k@ ?DT}+FJ
D.用strcmp()-n$Tg7pW"l\8[C

3?BW/J^"D h /h|]8~I5ve8J Bu
6.以下哪个PCRE正则表达式能匹配字符串php|architect?
!j;isb7_ B4y ,p4q n(f _c P Q G
A..*9B$J}J^fPVH*~
B....|.........
a n-gS#AdE C.\d{3}\|\d{8}
s-K OS4X/MRX D.[az]{3}\|[az]{9}
M1_ pb TIS1O @g0l E.[a-z][a-z][a-z]\|\w{9}
$W%}x ^5n?.YF3V
2fM%Jc)D[V
9K5Z#I(vO:c AF 7.以下哪些函数能用来验证字符串的完整性?(三选)
:I2KD2H2PjR zS
Y&L#}RU` A.md5()
z \-q1[S$Fj B.sha1()|N.tF;P5V
C.str_rot13()'V4v"_j D;Z n^2l9^"Y
D.crypt()O3@KAKY k
E.crc32()
,@9iIg{ b-j$a m
'I| sO0f
K1iMs"~B EL 8.哪个PHP函数与以下脚本在UNIX系统下执行的效果近似?[code] 4O*['P#R:r O7juL
<?php
@,G Q,j\.@b]+A function my_funct ($filename)
0}#S&@\rp {
#n~7e(wrU7ap,}         $f = file_get_contents ($filename);%]^a1O'jc[ {2u
        return explode ("\n", $f);
i5R8} H;lP }
Dv.pBBDy$H ?>[/code]A.fopen().]w.E v%}k@
B.fread()
0E O0f_F C.flock()cKKqU~P L5A C
D.split_string()
7P!O,]2xd#r p&sA2mf4q E.file()hrmW.q/{!H#H

QEY3? sO#t nZ _Jy%Yb3f`2?
9.基于指定的式样(pattern)把一个字符串分隔开并放入数组,以下哪些函数能做到?(双选)
1T?-a:~mF
:qeQ2W_T"w,[/M A.preg_split()g1ux!H6Y#Ks:\
B.ereg()
isYI | [3[ C.str_split()
W9wN"u$K R!C [#J D.explode()
Y]&M GUb E.chop() K?\d,t |q`Y
%]:[D w)er:Z0f%t
g8Ca[~yW,[
10.以下脚本输出什么?[code] H@]"Wg c e
<?php
+s$a Y5V?/G0a echo 'Testing ' . 1 + 2 . '45';
|d*MQ&Q(vK\ j l+H$` ?>[/code]A.Testing 1245
?b_W u B.Testing 345{-_%F~"M7sG
C.Testing 1+245
&y{H^+J3y$[*ms(q.| D.245"T9^$}w8n_
E.什么都没有
2~ `W(]8y0S'I Y _Hmb [r
2P/r8m4|N:m
11.以下脚本输出什么?[code]
+YTr ['W(K6g%D G^ <?php
M@;ggHv,{ s $s = '12345';MI"W{ g!M kg3_Y
$s[$s[1]] = '2';#j9G*hrX yx%T
echo $s;$B Sui ~;W&Z0V
?>[/code]A.12345g/ra{*[/U:A$U.y4M"^
B.12245
)e?+W4y6~ }c`-A C.22345
hs0g){*`G+bD D.11345
$}:s6Vd {9nFE:R E.ArraygF5iAXX

ZO.js3F5b6w
'tC4w0w;]f-D){Q 12.方框中的正则表达式能与以下哪些选项匹配?(双选)[code]
+?CB$}a| /.**123d/[/code]A.******1238B)KB9\!bnq }~ h1Y
B.*****_1234eK S-zDP#u k^,R
C.******1234 G.Vj2P[?
D._*1234
W:L9r x5S1{k"gS1Y.R E._*123gI`;O\D c
o[1} k-Yk

6_)f2b y)ME'yV 13.以下哪个比较将返回true?(双选)
.A3EY.~S
6GF&q3~$z} r w&E-L A.'1top' == '1'
1e t/I4h1_ m7E!_ B.'top' == 0
1j!M j2Y&iZG4GoDB C.'top' === 0
.jj4t:W%X)L4^ D.'a' == a h f%ADv0c
E.123 == '123'
G;Cj+E6~?[ :tSo|w*wf*Vj$G

oI a9BW_1\g 14.如果用+操作符把一个字符串和一个整型数字相加,结果将怎样?
C.a+u$M IK$mx
tU~7T$ub A.解释器输出一个类型错误dG ^Mnr%kA
B.字符串将被转换成数字,再与整型数字相加qk RU}
C.字符串将被丢弃,只保留整型数字
+fR,NQn9sme D.字符串和整型数字将连接成一个新字符串
'l]ii"['|u]'Fjv,C E.整形数字将被丢弃,而保留字符串w4~(I1O%~D x
f I[ YE
MDKL9u0lR
15.考虑如下脚本。假设[url=http://www.89w.org/][color=#006699]http://www.89w.org[/color][/url]能被访问,脚本将输出什么?[code]
KD'G5moD,xk3O <?php&[_'ouuiw9l ]#q
$s = file_get_contents (http://www.89w.org);
$fB2a/S eEV0A5h strip_tags ($s, array ('p'));
{/p4ca"P i o6w)R.O+}8[ echo count ($s);
4|&bR G3F,v/h ?>[/code]A.[url=http://www.89w.org/][color=#006699]www.89w.org[/color][/url]的主页的字符数
5] dlEpN(](^ B.剔除<p>标签后的[url=http://www.89w.org/][color=#006699]http://www.89w.org[/color][/url]主页的字符数3A+gA:i)h.o*w!@X
C.1
G])T,pH z d)D^9U D.0
l.T$x5\K&S7Al} E.剔除<p>以外的标签后的[url=http://www.89w.org/][color=#006699]http://www.89w.org[/color][/url]主页的字符数 {sP4h0O
8@2[4u;IC5dN^

v8G D_6sD@ 16.哪个函数能不区分大小写得对两个字符串进行二进制比对?
)j1C-K ]_Mf.A
I+Z:i&~z2nK^{ A.strcmp()
m0h#DZ+cx'\ B.stricmp()
J vWV P(p]+seC8} C.strcasecmp()
*dX4t#A.z4qiQ%iJ` D.stristr()MRHs@N6Z
E.以上都不能#[9AI5Za e

;O/~$FzF
HV%C]:y pu*kI;} 17.以下哪些函数能把字符串里存储的二进制数据转化成十六进制?(双选)
:SN&Tz[cJ+amo
'Xk*BO.d}$u } K a%V A.encode_hex()
F\vER B.pack()4?ek)^J"t-Z7geVt
C.hex2bin()
+lhC(E4CL0[8[#c D.bin2hex(){)t'_t~RV
E.printf()\i)e4R0a)z |P2C

v4q!CJ#CT j
!yqIx:P6iQ ^q*@ 18.哪个函数能用来确保一个字符串的字符数总是大于一个指定值?
fzt{+lz#aG Z*i2h(S |N;{
答案:____________ ok%P!vI
"TL |4lM6H~&R

({ q7DNf 19.以下脚本输出什么?[code] jkOY HG1@
<?php
eX`7y!h@ $a = 'able osts indy';+l.q,i$k qR%q)Dx
echo wordwrap ($a, 1, "c", false);W-vObzt4D
?>[/code]答案:____________LhZ,vl-J"w Wu;Km

.o/ZEaY;t"p&f
5I-o*b+O-k8C M_y5V 20.以下脚本输出什么?[code]
2Z9@e%MI R$a$J;U/n <?php*yg"E1bv#zIB&n%]
$x = 'apple';
sOh&Puhv echo substr_replace ($x, 'x', 1, 2);he;n(?O7|
?>[/code]A.xg6h7mwU:QKF`;cm
B.axle
fJ},b pD| C.axxle
dY,{K9W D.applex
|i a5m"sH)@ E.xapple3qO U)Rw)z,[dN
S)VW0qT7A9H3D-a;B

q2V~k5Zk.W6DEZ I$T 7~y.~`D)V
答案速查s9d3rgV
1:D#l#y!V.IA(Lh3ul
2:A
BZ,qrz"o{5H 3:D
i-yy-P:DM!a&J2h 4:Dx5U\~ ^? Hfx|'e
5:Dv lj,z:JRu G
6:EO){8ac9|t}
7:ABE
6P/j6X"\.l_D;\ 8:E
]0?;Hl$p2B&~qd!Z 9:AD
f Vk&c4o@ _ SWd 10:D:p cn9H%G9B1j
11:B
!TfJ#G]G 12:CDj+L$U0} ^,Z,`O
13:BE;N'UV,fg!`$v.^uTo
14:B*Ju-[:o"srT
15:C
I{ ?T3dbt?v/] 16:C
2Ix)Nz%@ A6@!O%^k 17:BD|-t5IJ-\1YW
18:str_pad
3V@c*Er4Fr)u 19:ablecostscindy
9K'FFOcp 20:B
'Q}6T#I?*j?5z `Q
!f]u}!i%a6oc8ms LdNUd8J4r&I K

^-se)i%s B:G 答案详解
yg,`#O!N!uSM yo#C 2F?4k|'s {,u
1.substr函数能够胜任,但考虑到输出三个字母就需要三次调用该函数,所以排除此方法。那么$alpha{$val}和$alpha{$val+1}是仅有的两个可能输出题目要求的字符串的选项。因为0是数组的第一个索引,所以答案是D。 g8D"f5ri4R)`3bLg

gkNJ8r)RH 2.除了A以外的选项都能输出题目要求的字符串。PHP中,加号(+)不能把两个字符串合并成一个。
:yOYmA Yd!b H N^%f `w(ic
3.substr函数返回字符串的一部分,而strpos函数擅长从一个字符串中找出某个指定的子串。同时使用这两个函数将满足题目要求。注意,前一个函数从0开始索引,而后者不是,因此需要+1。答案是D。 ly C6}:V"C1}
(^`9}.Y3\3b"{3R]Q
4.答案是D。explode函数使用一个字符串分隔另一个字符串,并把结果放入一个新建的数组。strtok函数也可以做同样的事,但需要多次调用。Uw l-l9_2di
0l[lq4S7{
5.答案是D。strcmp()提供了安全的字符串比较机制。注意,选项C是错的,strcasecmp()不是一个“万能”函数,因为它不区分大小写。
\R!?'i:Qv\9@] *mh)[ M^
6.选项中没有一个正则表达式能真正代表题目所给字符串的匹配方式,但是选项A和E仍然能勉强匹配。选项A太普通了,它能够匹配任何字符串,因此答案是E。
JL-t'H.V&d0c-Y5M y
$xc g3oB"K 7.正确答案是A,B和E。用crypt()和str_rot13()来验证一个字符串是否被改变,效率很低。crc32()比前面两个函数好些,如果能容忍一些小错误的话,它是个不错的选择。
1F(cM&i8d )M/g?e0T6q9M
8.file函数将文件的文本内容读入一个数组,每个元素是一行。因此答案E正确。也许你想知道为什么要把这样一个题目放在讲字符串的章节中,那是为了提醒你每一章的题目所包含的知识点并不是绝对严格区分开的,正如写PHP脚本时,file函数不能脱离字符串函数单独存在一样。
Jc)eM1d{Z:J } d j-^8Xd
9.尽管条件不同,但preg_split和explode函数都能满足题目要求。ereg()拿一个正则表达式匹配一个字符串;str_split()按固定长度分隔字符串;而chop()则是rtrim()别名,用来移除字符串末尾处的空格。
x#i ~e1? q+z,wb 0Wqk8`oGg(D
10.本题考察你对字符串操作及操作符优先级的认识。连接运算符(.)的优先级比加号(+)高。因此PHP解释器实际执行的运算可以表示为('Testing ' . 1) + (2 . '45')。由于字符串test 1不是数字,所以加号前面的运算等于0。加号后面的运算等于245,PHP输出的结果是0+245,等于245,所以答案是D。
s7H:X6ZWWZ
Y7\4h6Dvf$F%i;e[&V{ 11.可以用访问数组元素的方式访问字符串中的字符,因此脚本只是把字符串中的第二个字符($s[1])替换成了字符2,最终将输出12245。答案是B。
D#t&j!QG'].c Oo9UQ/jDF
12.本题的要点是理解这个正则表达式的含义——从左往右,首先是零个或多个任意字符(.*),跟着是一个星号(\*),然后是123,最后是一个数字。因此答案是C和D。
"EWr4fd&A_0B +P#Eg,E2KkSg0] lM
13.B和E正确。选项B中,在比较时,字符串top等同于数字0。==操作符不比对数据类型,所以将返回true。答案E中,字符串123等同于数字123,比较将返回true。
9z1e'v#byo\$S N Ox\J}#p+A0Z
14.字符串将被转换成数字(如果无法发生转换就是0),然后与整型数字相加。答案是B。
v*NW.c.Han`w 6G ` R'c3d?/H L+J8a
15.代码的本意是剔除[url=http://www.php.net/][color=#006699]www.php.net[/color][/url]主页上除了p以外的的所有HTML标签。可实际上,在代码的最后一行使用了count函数,它统计变量中的元素数量,而不是字符串中的字符数。由于字符串是标量,对字符串使用count函数将永远返回1。答案是C。
@y?[t
1gD;U.a*Cz 16.题目其实就是在描述strcasecmp函数的作用,因此答案是C。
!@ Sn+G?$c$j VRC3r H
17.正确答案是B和D。pack函数能对二进制数据进行复杂的格式化,包括将字符串中的字符转化成十六进制表示。bin2hex函数也有同样的转化功能。注意,printf()能将整数转化成十六进制数,但无法转化字符串。i*w_+zo lIn ][3c2U

rJ'V2Rx |e2qo 18.这是在说str_pad函数,它可以把字符串填充到指定长度。iM)w _EB4p
Y9s!PGe)`$|N;Wz.eu8d
19.脚本将输出ablecostscindy。wordwrap函数通常用来把字符串切割成指定长度。然而在本题中,长度被设置为1,因此函数将从空格处切割(第四个参数被设置为false,因此函数不会从单词的中间进行切割)。填充字符串是c,等于把每个空格都换成了c。$~)`_5I\,lc nY,tH
'^)g,E](ur4l
20.substr_replace函数是用一个指定字符串替换原字符串中的某个部分,因此脚本输出axle,答案是B。

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.