  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第五章 - 字符串与正则表达式
字符串是PHP的“瑞士军刀”——作为一种Web开发语言,PHP最常打交道的就是字符串。因此对于开发者来说,处理字符串是一项非常基础的技能。
! G! o8 J1 W0 H) n" K; W: j& A0 r幸运的是,由于PHP开发团队的努力,PHP对字符串的处理相当易学。你只需迈过第一个难关,接下来就一马平川了。
* Q! e) }- n) |2 U: t# V% u但是,PHP的这一部分功能并非完美。本章考验你对字符串的了理解及对处理字符串的函数的认识。此外,你还必须面对正则表达式——一个非常有用,却总是被开发者忽试的工具——的编写艺术。2 z6 J* d+ {# B5 y) r: d
: _' Y4 N! W; N. u( N
1 e8 m; M& w5 i3 i1 N2 K6 k" ] b问题
# ]# s% E+ H5 z$ }; \
8 W; m" D- b8 R9 r' l3 C/ K* N( ]1.考虑如下脚本。标记处应该添加什么代码才能让脚本输出字符串php?-
- <?php
- $alpha = 'abcdefghijklmnopqrstuvwxyz';
- $letters = array(15, 7, 15);
- foreach($letters as $val) {
- /* 这里应该加入什么 */
- }
- ?>
复制代码 A.echo chr($val);) L4 z- Z2 N" a! g
B.echo asc($val);5 [$ b2 J. ~: n% O- a3 X
C.echo substr($alpha, $val, 2);
: x. p& L1 @6 z$ Z: J$ ID.echo $alpha{$val};% e4 y1 c: n3 X' Y0 B+ I \
E.echo $alpha{$val+1}
' m! i8 I" x5 v* w
- F' N: y* g' x3 X4 x. X. F7 M$ u6 M! K2 l
2.以下哪一项不能把字符串$s1和$s2组成一个字符串?
* J& B# L; Z* j& k/ u/ P6 [3 {' r7 w \0 d" k' ^5 i1 F
A.$s1 + $s2
5 m6 M4 n, P. `! c$ Y j: T; WB."{$s1}{$s2}"
7 T1 Q- R. q( h. g0 A3 FC.$s1.$s29 E8 |6 l; u; c6 y
D.implode('', array($s1,$s2))
2 C- t. t, a8 P: dE.以上都可以
0 s* o/ b( _( v0 r# Y/ k$ l: S4 [ ]$ M9 C6 k( k/ h/ T/ G8 V0 E; C! m! z
' n- l/ O+ i M% }: [8 u# N. i3.变量$email的值是字符串user@example.com,以下哪项能把字符串转化成example.com?
. y: Y5 @3 J5 \* Q# E( Z5 A: b* h1 y. B7 c, z
A.substr($email, strpos($email, "@"));; q, u1 ~; O6 w
B.strstr($email, "@");
' K& ]9 O: u1 C+ qC.strchr($email, "@");& c2 y) {+ R, T. G* r
D.substr($email, strpos($email, "@")+1);
- `+ @/ N( a J+ M8 J) {E.strrpos($email, "@");4 Z8 K* a- s: |7 q6 Y
- m# m5 s( H* \
" g1 R# p/ I7 N; a1 ~9 Z6 V5 b
4.给定一个用逗号分隔一组值的字符串,以下哪个函数能在仅调用一次的情况下就把每个独立的值放入一个新创建的数组?
f, B8 ]' E- L4 T/ x. M
; h" ~& \2 e o! d. |& fA.strstr()3 V, X) D3 V. T: j
B.不可能只调用一次就完成
$ W% p* b6 z& j R5 M$ Z3 r$ XC.extract(), B' K9 T" t5 t( X
D.explode()
1 T5 K1 Q0 B$ v+ h) J" ~1 GE.strtok()4 N2 |0 h" S2 @6 {' L
1 p% `6 }; Y: U7 X$ I3 G6 d1 d0 e
* C3 [" y& Z$ P5.要比较两个字符串,以下那种方法最万能?0 i, r2 ^% J# {6 S3 N) X8 A3 K2 @& n
- T( ?6 } M$ Z
A.用strpos函数
- B5 U2 N0 F: {! mB.用==操作符
& {& J8 T6 G+ L7 f1 l3 m) e( }C.用strcasecmp()
) H( r6 G3 u. ]D.用strcmp()
% b0 E5 S* ?% i- Z+ `* E% r
+ ]* O: `& O1 \4 f, g! U9 y i/ Q1 O& O2 A& u
6.以下哪个PCRE正则表达式能匹配字符串php|architect?# \/ I: L( S2 Y, v8 f2 ~
4 E- O1 e' G% O+ x
A..*: T! Y+ P) G0 I/ k! v
B....|.........0 Y" e7 E& J9 N- I4 X e0 V% A! J
C.\d{3}\|\d{8}
3 G: z. I! E+ p; V) ]D.[az]{3}\|[az]{9}* k- ]8 x$ [$ l% \5 Z
E.[a-z][a-z][a-z]\|\w{9}
% J6 m3 }' Y R7 w* G0 h: D0 C9 T# [1 {# d! N8 g' e# P
" O8 a5 M" {9 m; Q' E: \0 D( W7.以下哪些函数能用来验证字符串的完整性?(三选)
$ i" ]* B) a" `0 W1 z' d6 }7 E( n) _' _6 |. k: X0 e8 Z2 a/ @
A.md5()
3 J' n3 o0 F0 _0 {! o& v# oB.sha1()
7 C1 q# J! C# j/ v2 ^9 YC.str_rot13()
/ \0 p7 ], e5 W6 v5 p+ \3 @' \D.crypt()
, N: [0 P9 {, x, GE.crc32()
5 ] x7 n& _! c" b$ w' x
( H& P6 l( H8 p# [; B# Z D. v
5 Z! h9 }. @) F5 _0 g! p2 r8.哪个PHP函数与以下脚本在UNIX系统下执行的效果近似?-
- <?php
- function my_funct ($filename)
- {
- $f = file_get_contents ($filename);
- return explode ("\n", $f);
- }
- ?>
复制代码 A.fopen()
; ~. `# h% Z3 {) NB.fread()
; X* O {+ r: r/ S/ C0 b( xC.flock()
, L* V0 o3 p: BD.split_string()4 h, r. b2 O7 q0 h
E.file()
% b$ T7 p" U- x4 Z Y' l: s- o Z' b2 I& n9 \
1 M/ s1 @' R* `( j3 W
9.基于指定的式样(pattern)把一个字符串分隔开并放入数组,以下哪些函数能做到?(双选). X7 M5 h: g& K3 y% g! z
9 I, u, Y4 A5 `: G: F5 x1 a0 [- nA.preg_split()4 w+ t: @% F$ t
B.ereg()
8 L2 s! o1 g8 U1 @6 vC.str_split()( z5 l1 e$ n- f1 W& T
D.explode()
: D {) s9 S! N) M9 C' U5 v+ lE.chop()
5 \7 x% G7 Z7 T8 _/ Q: e0 p( |& T: n7 c) r
* N0 |5 \& ~$ L k0 b$ G x* \
10.以下脚本输出什么?-
- <?php
- echo 'Testing ' . 1 + 2 . '45';
- ?>
复制代码 A.Testing 12456 _ U1 r9 Y* w# H
B.Testing 345* E: @. q+ ~/ i! R5 w6 n
C.Testing 1+245 i3 H$ @7 M- G* c# ^, D
D.245/ G0 J9 T1 W& {
E.什么都没有9 \) V5 S2 ~/ i+ z8 d
/ h' _3 J K3 _* V" d. m3 }
" G" @0 E) M- @0 j0 w1 B! X, _- V3 S11.以下脚本输出什么?-
- <?php
- $s = '12345';
- $s[$s[1]] = '2';
- echo $s;
- ?>
复制代码 A.12345
- S+ F Y) r+ ^. B4 h" S3 dB.12245; l' F. p; u, A" O% X D
C.22345
8 ?" u3 v0 ^! z; ~6 T/ O- WD.11345) c8 {/ S, T( q/ h5 T
E.Array
. p% Q$ `+ l5 ~8 E
( S, ?4 g$ U- ?9 ~/ L3 m3 _
) {; H1 m0 r( W# u$ U# |% L7 S/ J6 u12.方框中的正则表达式能与以下哪些选项匹配?(双选)A.******123+ Q3 O3 Z) v; W
B.*****_1234* K+ R5 R' w8 s/ a: R* p
C.******1234
4 `- g: V ^; A2 l# ?D._*1234
7 V5 a. T$ T/ y& n; O6 U" R& ~E._*123, T5 t" g( j( O
3 z) {: a, C" K; @
+ `3 k3 R9 x! L" ?& U% \13.以下哪个比较将返回true?(双选)- P0 K, X% U3 V1 X Y& Q9 u( m/ j
& I. A' b. o2 R1 M% o. V! B9 xA.'1top' == '1'/ |5 ?% M( g5 r& N2 S2 G+ j
B.'top' == 00 b: D' G+ n. K0 H4 Z
C.'top' === 0
0 |9 T' N! ?2 C5 ^' r' U4 UD.'a' == a
. v( j8 T$ E7 f U! |% O* GE.123 == '123'
- O! e. _) w5 c+ j8 O& t& S; Y) M* V$ k% b/ R9 m/ p5 m
# v( d j& k/ Z5 r8 U
14.如果用+操作符把一个字符串和一个整型数字相加,结果将怎样?% }. c* {# U" S) E7 Z
8 r9 E# X# q! y6 L( Y: v
A.解释器输出一个类型错误
1 j; Z0 h. d$ p' W& tB.字符串将被转换成数字,再与整型数字相加
5 C7 a3 B$ I( S% _5 M+ jC.字符串将被丢弃,只保留整型数字
) D& z4 \6 }$ h9 ~7 ?8 HD.字符串和整型数字将连接成一个新字符串: b' I3 x. i* Y, x- Q- ^! D
E.整形数字将被丢弃,而保留字符串' i* a o8 G; x9 ]; M
# \3 N+ U. g* c- u- V4 F7 j' V- I' w* d
15.考虑如下脚本。假设http://www.89w.org能被访问,脚本将输出什么?-
- <?php
- $s = file_get_contents (http://www.89w.org);
- strip_tags ($s, array ('p'));
- echo count ($s);
- ?>
复制代码 A.www.89w.org的主页的字符数1 [0 X1 P1 A1 `$ z+ B4 b
B.剔除<p>标签后的http://www.89w.org主页的字符数
0 V1 K* K" e3 K& K+ p/ W8 UC.15 R' `) k" A" v2 f d6 ~3 s
D.00 Z" i( A! @/ T* A# E& F; l
E.剔除<p>以外的标签后的http://www.89w.org主页的字符数0 j" X- `1 q4 A8 L) L- j
' j: [! T0 [1 h* h
; |. g4 `/ n/ b2 p2 l9 T16.哪个函数能不区分大小写得对两个字符串进行二进制比对?
( K" O) z8 a {5 [: z# r, N7 Y0 _1 @
A.strcmp()9 z9 t' r- Z& W8 X- I
B.stricmp()8 P* H- | {) b; b, p8 x' o" G/ b
C.strcasecmp()
, Z1 X5 L# s9 x0 N% x4 V' o3 tD.stristr()
; `; s4 C! `- J8 q) T* ZE.以上都不能
6 R4 C4 U+ K2 W$ G) N/ [# U& @" b0 r: I9 O: P
8 q- a+ @% ^& {/ I6 q7 Z
17.以下哪些函数能把字符串里存储的二进制数据转化成十六进制?(双选)
( \# [- t" \4 J# T5 a
# h7 V! g& x& OA.encode_hex()
2 e/ \6 B$ d. p. L& xB.pack()' {$ a& h$ C8 f% [
C.hex2bin()$ c$ @% M. u' ?+ Z, S" R# Q
D.bin2hex()
" U8 p/ C3 z7 ]' ZE.printf()
* K2 C4 H- V5 `. m4 |
$ o# r3 R5 a$ U7 X% S
( H# u- w) T5 y r! X' y18.哪个函数能用来确保一个字符串的字符数总是大于一个指定值?. V* D% Q6 ?3 y6 T
4 H) y! S! l8 M: O: s! W3 o
答案:____________
2 u5 A! P1 |# P' ~5 A7 k" U2 P+ q9 I
6 W; ^3 X0 A/ M" H% x/ z$ b( _0 x1 W" i7 U( _$ r
19.以下脚本输出什么?-
- <?php
- $a = 'able osts indy';
- echo wordwrap ($a, 1, "c", false);
- ?>
复制代码 答案:____________. u7 v) v- ]' ]3 C7 _
. [, Q" b, |4 H5 x! }5 D/ ?6 C; g: a2 x0 Y+ h6 H1 U$ r; x5 p
20.以下脚本输出什么?-
- <?php
- $x = 'apple';
- echo substr_replace ($x, 'x', 1, 2);
- ?>
复制代码 A.x: V* |5 `8 w) x7 d& L5 ?
B.axle
8 \! |* M. @0 ?C.axxle- }0 |& I5 M% W$ R0 Z1 j
D.applex6 ]/ W0 w$ P0 c2 w. N/ v
E.xapple" w4 [( E0 Y( ?
: ~) P! t& b. Y' G2 C$ F
/ Z: m0 k% D2 H5 K$ w; T+ b- J
% K5 K' i5 {+ M/ ?7 u% _! m答案速查
8 G7 G a- Z% H5 F1:D" ?/ j: ~9 @" U* u
2:A) l) ?+ }2 c7 H4 `7 \$ s
3:D
* j8 P5 q/ X1 e! _& |4:D
/ ?% ?" f+ T' L f, M5:D
4 a8 z7 F7 O9 e6:E8 w+ S; }+ {7 }; B$ `- T) k
7:ABE
. s6 T! J$ G6 ^6 o9 V+ M8:E
/ b" D( _6 o t& q4 u- J9:AD6 S0 k3 @6 v" x5 k) B2 A
10:D" `8 R0 F0 D) P0 Q, V5 {
11:B
! m5 `1 S7 {1 x) K8 a% e12:CD
( M2 b' i' D5 I8 w$ Z- q13:BE
0 W1 v: k& m2 {8 P8 _3 r14:B
; Q& Q! O$ e+ L- Z+ ^4 ` ~; l& X& M15:C
, u: {1 W5 m. i. M! I9 R16:C
% y7 X Q2 W5 }- W" `: i17:BD
6 P: Y! `. \( t2 ~18:str_pad9 C, b- v4 a# g( L3 r
19:ablecostscindy
$ X$ |" o- ?" {: q( N$ ^, p, y: E20:B+ X& S- e, P9 m3 \% v f
. h7 ^4 p p# ~
9 @/ M1 d+ }9 O7 g0 f4 L1 N) |
7 Y) p4 V) K# x
答案详解
" g: U, |% E' C
7 Q+ y* I/ r- p5 a0 y: c1 p1.substr函数能够胜任,但考虑到输出三个字母就需要三次调用该函数,所以排除此方法。那么$alpha{$val}和$alpha{$val+1}是仅有的两个可能输出题目要求的字符串的选项。因为0是数组的第一个索引,所以答案是D。
+ n/ ~8 K a; t n4 M8 J' a$ F! \4 S7 i& a9 D/ L2 p
2.除了A以外的选项都能输出题目要求的字符串。PHP中,加号(+)不能把两个字符串合并成一个。+ }, S* }$ ]* J/ Y- ^
# ~0 R1 G7 H% p8 |8 @; i% t3.substr函数返回字符串的一部分,而strpos函数擅长从一个字符串中找出某个指定的子串。同时使用这两个函数将满足题目要求。注意,前一个函数从0开始索引,而后者不是,因此需要+1。答案是D。
- y6 n. W0 k- _+ n( g* O- p3 x" q5 Z/ r: ]
4.答案是D。explode函数使用一个字符串分隔另一个字符串,并把结果放入一个新建的数组。strtok函数也可以做同样的事,但需要多次调用。
- j/ G# |" `; v) x. y* y a. N. \6 N9 M; k6 ^" ]
5.答案是D。strcmp()提供了安全的字符串比较机制。注意,选项C是错的,strcasecmp()不是一个“万能”函数,因为它不区分大小写。
2 Q/ V% {' w3 g1 ^3 H2 o" f' q$ j3 ] N! a7 C5 P
6.选项中没有一个正则表达式能真正代表题目所给字符串的匹配方式,但是选项A和E仍然能勉强匹配。选项A太普通了,它能够匹配任何字符串,因此答案是E。' Z; `; C! X+ ^4 ^
' ~' ^$ A& ]7 i* }/ x7.正确答案是A,B和E。用crypt()和str_rot13()来验证一个字符串是否被改变,效率很低。crc32()比前面两个函数好些,如果能容忍一些小错误的话,它是个不错的选择。
% n# _' l; I4 [1 [* M1 p
$ L1 q' W6 o) `% W- P! w8.file函数将文件的文本内容读入一个数组,每个元素是一行。因此答案E正确。也许你想知道为什么要把这样一个题目放在讲字符串的章节中,那是为了提醒你每一章的题目所包含的知识点并不是绝对严格区分开的,正如写PHP脚本时,file函数不能脱离字符串函数单独存在一样。
3 b( V0 D' z2 A5 _6 _; @5 V6 W$ w" b- I% Y& r
9.尽管条件不同,但preg_split和explode函数都能满足题目要求。ereg()拿一个正则表达式匹配一个字符串;str_split()按固定长度分隔字符串;而chop()则是rtrim()别名,用来移除字符串末尾处的空格。
) D1 O* o3 ]7 k/ V
* X5 f# A9 {& G5 o: D+ [. C10.本题考察你对字符串操作及操作符优先级的认识。连接运算符(.)的优先级比加号(+)高。因此PHP解释器实际执行的运算可以表示为('Testing ' . 1) + (2 . '45')。由于字符串test 1不是数字,所以加号前面的运算等于0。加号后面的运算等于245,PHP输出的结果是0+245,等于245,所以答案是D。5 q5 x' f0 u( i3 | F2 @8 g- N$ E2 r0 s
9 _2 ^/ n6 B' A+ h3 E* J' h! S11.可以用访问数组元素的方式访问字符串中的字符,因此脚本只是把字符串中的第二个字符($s[1])替换成了字符2,最终将输出12245。答案是B。
" Q& b7 r1 f- g/ o, Z. X$ W$ T2 B$ g n s6 \
12.本题的要点是理解这个正则表达式的含义——从左往右,首先是零个或多个任意字符(.*),跟着是一个星号(\*),然后是123,最后是一个数字。因此答案是C和D。( U+ B3 N) |; C& r6 I. S, S
6 o& W! e4 X" M
13.B和E正确。选项B中,在比较时,字符串top等同于数字0。==操作符不比对数据类型,所以将返回true。答案E中,字符串123等同于数字123,比较将返回true。, U# j( t [/ k0 ^
8 c+ K2 c- @3 F5 ]8 F! k% S14.字符串将被转换成数字(如果无法发生转换就是0),然后与整型数字相加。答案是B。
# l" j" L2 G/ C# s" l. i$ g, K9 l/ T3 a* J& u+ M' x7 B
15.代码的本意是剔除www.php.net主页上除了p以外的的所有HTML标签。可实际上,在代码的最后一行使用了count函数,它统计变量中的元素数量,而不是字符串中的字符数。由于字符串是标量,对字符串使用count函数将永远返回1。答案是C。1 I, F8 C( q/ H& I' O
6 ]" w$ C G* P16.题目其实就是在描述strcasecmp函数的作用,因此答案是C。
0 ?$ i7 M8 Q; }
6 { y! E: ^+ u c17.正确答案是B和D。pack函数能对二进制数据进行复杂的格式化,包括将字符串中的字符转化成十六进制表示。bin2hex函数也有同样的转化功能。注意,printf()能将整数转化成十六进制数,但无法转化字符串。
3 a. E) L% \8 a( D% n( l: g
3 _! f& _; M" |" `18.这是在说str_pad函数,它可以把字符串填充到指定长度。
5 h* C4 C9 E9 C4 K H; Z+ ?+ {6 Q% P- b# v3 Q
19.脚本将输出ablecostscindy。wordwrap函数通常用来把字符串切割成指定长度。然而在本题中,长度被设置为1,因此函数将从空格处切割(第四个参数被设置为false,因此函数不会从单词的中间进行切割)。填充字符串是c,等于把每个空格都换成了c。
3 k/ [* |$ ~* w4 s$ t) d
, N4 H' d3 |3 V) r& _* S20.substr_replace函数是用一个指定字符串替换原字符串中的某个部分,因此脚本输出axle,答案是B。 |
|