+ -
当前位置:首页 → 问答吧 → [连载][Zend权威认证试题讲解]第五章 - 字符串与正则表达式

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

时间:2008-03-13

来源:互联网

明天要去外地,所以提前一天发布。

查看其他章节

字符串是PHP的“瑞士军刀”――作为一种Web开发语言,PHP最常打交道的就是字符串。因此对于开发者来说,处理字符串是一项非常基础的技能。
幸运的是,由于PHP开发团队的努力,PHP对字符串的处理相当易学。你只需迈过第一个难关,接下来就一马平川了。
但是,PHP的这一部分功能并非完美。本章考验你对字符串的了理解及对处理字符串的函数的认识。此外,你还必须面对正则表达式――一个非常有用,却总是被开发者忽试的工具――的编写艺术。


问题

1.考虑如下脚本。标记处应该添加什么代码才能让脚本输出字符串php?
复制PHP内容到剪贴板
PHP代码:

<?php
$alpha = 'abcdefghijklmnopqrstuvwxyz';
$letters = array(15, 7, 15);
foreach($letters as $val) {
        /* 这里应该加入什么 */
}
?>

A.echo chr($val);
B.echo asc($val);
C.echo substr($alpha, $val, 2);
D.echo $alpha{$val};
E.echo $alpha{$val+1}


2.以下哪一项不能把字符串$s1和$s2组成一个字符串?

A.$s1 + $s2
B."{$s1}{$s2}"
C.$s1.$s2
D.implode('', array($s1,$s2))
E.以上都可以


3.变量$email的值是字符串[email protected],以下哪项能把字符串转化成example.com?

A.substr($email, strpos($email, "@"));
B.strstr($email, "@");
C.strchr($email, "@");
D.substr($email, strpos($email, "@")+1);
E.strrpos($email, "@");


4.给定一个用逗号分隔一组值的字符串,以下哪个函数能在仅调用一次的情况下就把每个独立的值放入一个新创建的数组?

A.strstr()
B.不可能只调用一次就完成
C.extract()
D.explode()
E.strtok()


5.要比较两个字符串,以下那种方法最万能?

A.用strpos函数
B.用==操作符
C.用strcasecmp()
D.用strcmp()


6.以下哪个PCRE正则表达式能匹配字符串php|architect?

A..*
B....|.........
C.\d{3}\|\d{8}
D.[az]{3}\|[az]{9}
E.[a-z][a-z][a-z]\|\w{9}


7.以下哪些函数能用来验证字符串的完整性?(三选)

A.md5()
B.sha1()
C.str_rot13()
D.crypt()
E.crc32()


8.哪个PHP函数与以下脚本在UNIX系统下执行的效果近似?
复制PHP内容到剪贴板
PHP代码:

<?php
function my_funct ($filename)
{
        $f = file_get_contents ($filename);
        return explode ("\n", $f);
}
?>

A.fopen()
B.fread()
C.flock()
D.split_string()
E.file()


9.基于指定的式样(pattern)把一个字符串分隔开并放入数组,以下哪些函数能做到?(双选)

A.preg_split()
B.ereg()
C.str_split()
D.explode()
E.chop()


10.以下脚本输出什么?
复制PHP内容到剪贴板
PHP代码:

<?php
echo 'Testing ' . 1 + 2 . '45';
?>

A.Testing 1245
B.Testing 345
C.Testing 1+245
D.245
E.什么都没有


11.以下脚本输出什么?
复制PHP内容到剪贴板
PHP代码:

<?php
$s = '12345';
$s[$s[1]] = '2';
echo $s;
?>

A.12345
B.12245
C.22345
D.11345
E.Array


12.方框中的正则表达式能与以下哪些选项匹配?(双选)
复制PHP内容到剪贴板
PHP代码:
/.**123d/

A.******123
B.*****_1234
C.******1234
D._*1234
E._*123


13.以下哪个比较将返回true?(双选)

A.'1top' == '1'
B.'top' == 0
C.'top' === 0
D.'a' == a
E.123 == '123'


14.如果用+操作符把一个字符串和一个整型数字相加,结果将怎样?

A.解释器输出一个类型错误
B.字符串将被转换成数字,再与整型数字相加
C.字符串将被丢弃,只保留整型数字
D.字符串和整型数字将连接成一个新字符串
E.整形数字将被丢弃,而保留字符串


15.考虑如下脚本。假设http://www.php.net能被访问,脚本将输出什么?
复制PHP内容到剪贴板
PHP代码:

<?php
$s = file_get_contents ("http://www.php.net");
strip_tags ($s, array ('p'));
echo count ($s);
?>

A.www.php.net的主页的字符数
B.剔除<p>标签后的www.php.net主页的字符数
C.1
D.0
E.剔除<p>以外的标签后的www.php.net主页的字符数


16.哪个函数能不区分大小写得对两个字符串进行二进制比对?

A.strcmp()
B.stricmp()
C.strcasecmp()
D.stristr()
E.以上都不能


17.以下哪些函数能把字符串里存储的二进制数据转化成十六进制?(双选)

A.encode_hex()
B.pack()
C.hex2bin()
D.bin2hex()
E.printf()


18.哪个函数能用来确保一个字符串的字符数总是大于一个指定值?

答案:____________


19.以下脚本输出什么?
复制PHP内容到剪贴板
PHP代码:

<?php
$a = 'able osts indy';
echo wordwrap ($a, 1, "c", false);
?>

答案:____________


20.以下脚本输出什么?
复制PHP内容到剪贴板
PHP代码:

<?php
$x = 'apple';
echo substr_replace ($x, 'x', 1, 2);
?>

A.x
B.axle
C.axxle
D.applex
E.xapple



答案速查
1:D
2:A
3:D
4:D
5:D
6:E
7:ABE
8:E
9:AD
10:D
11:B
12:CD
13:BE
14:B
15:C
16:C
17:BD
18:str_pad
19:ablecostscindy
20:B



答案详解

1.substr函数能够胜任,但考虑到输出三个字母就需要三次调用该函数,所以排除此方法。那么$alpha{$val}和$alpha{$val+1}是仅有的两个可能输出题目要求的字符串的选项。因为0是数组的第一个索引,所以答案是D。

2.除了A以外的选项都能输出题目要求的字符串。PHP中,加号(+)不能把两个字符串合并成一个。

3.substr函数返回字符串的一部分,而strpos函数擅长从一个字符串中找出某个指定的子串。同时使用这两个函数将满足题目要求。注意,前一个函数从0开始索引,而后者不是,因此需要+1。答案是D。

4.答案是D。explode函数使用一个字符串分隔另一个字符串,并把结果放入一个新建的数组。strtok函数也可以做同样的事,但需要多次调用。

5.答案是D。strcmp()提供了安全的字符串比较机制。注意,选项C是错的,strcasecmp()不是一个“万能”函数,因为它不区分大小写。

6.选项中没有一个正则表达式能真正代表题目所给字符串的匹配方式,但是选项A和E仍然能勉强匹配。选项A太普通了,它能够匹配任何字符串,因此答案是E。

7.正确答案是A,B和E。用crypt()和str_rot13()来验证一个字符串是否被改变,效率很低。crc32()比前面两个函数好些,如果能容忍一些小错误的话,它是个不错的选择。

8.file函数将文件的文本内容读入一个数组,每个元素是一行。因此答案E正确。也许你想知道为什么要把这样一个题目放在讲字符串的章节中,那是为了提醒你每一章的题目所包含的知识点并不是绝对严格区分开的,正如写PHP脚本时,file函数不能脱离字符串函数单独存在一样。

9.尽管条件不同,但preg_split和explode函数都能满足题目要求。ereg()拿一个正则表达式匹配一个字符串;str_split()按固定长度分隔字符串;而chop()则是rtrim()别名,用来移除字符串末尾处的空格。

10.本题考察你对字符串操作及操作符优先级的认识。连接运算符(.)的优先级比加号(+)高。因此PHP解释器实际执行的运算可以表示为('Testing ' . 1) + (2 . '45')。由于字符串test 1不是数字,所以加号前面的运算等于0。加号后面的运算等于245,PHP输出的结果是0+245,等于245,所以答案是D。

11.可以用访问数组元素的方式访问字符串中的字符,因此脚本只是把字符串中的第二个字符($s[1])替换成了字符2,最终将输出12245。答案是B。

12.本题的要点是理解这个正则表达式的含义――从左往右,首先是零个或多个任意字符(.*),跟着是一个星号(\*),然后是123,最后是一个数字。因此答案是C和D。

13.B和E正确。选项B中,在比较时,字符串top等同于数字0。==操作符不比对数据类型,所以将返回true。答案E中,字符串123等同于数字123,比较将返回true。

14.字符串将被转换成数字(如果无法发生转换就是0),然后与整型数字相加。答案是B。

15.代码的本意是剔除www.php.net主页上除了p以外的的所有HTML标签。可实际上,在代码的最后一行使用了count函数,它统计变量中的元素数量,而不是字符串中的字符数。由于字符串是标量,对字符串使用count函数将永远返回1。答案是C。

16.题目其实就是在描述strcasecmp函数的作用,因此答案是C。

17.正确答案是B和D。pack函数能对二进制数据进行复杂的格式化,包括将字符串中的字符转化成十六进制表示。bin2hex函数也有同样的转化功能。注意,printf()能将整数转化成十六进制数,但无法转化字符串。

18.这是在说str_pad函数,它可以把字符串填充到指定长度。

19.脚本将输出ablecostscindy。wordwrap函数通常用来把字符串切割成指定长度。然而在本题中,长度被设置为1,因此函数将从空格处切割(第四个参数被设置为false,因此函数不会从单词的中间进行切割)。填充字符串是c,等于把每个空格都换成了c。

20.substr_replace函数是用一个指定字符串替换原字符串中的某个部分,因此脚本输出axle,答案是B。

[ 本帖最后由 Ven 于 2008-3-14 01:42 编辑 ]

作者: Ven   发布时间: 2008-03-13

你可能觉得PHP的文件操作功能并不怎样,但实际上它对开发者来说非常有用。即使你是做网站开发的,学会相关技能也能让你如虎添翼。多亏了流包装器(stream wrappers,将在第十章详细介绍),PHP才能够打开并读取远程文件,让在本地使用第三方网站的内容变得可能。
站在更底层的角度,文件输入/输出能完成多种任务。可以用他读取预制文件的内容,比如第三方提供的内容;或者通过PHP脚本让浏览器打开一个二进制文件,使得你能更切实的控制它。无论如何,本章不仅考验你打开、关闭和读取文件的能力,还考查多进程下进行文件操作的基础知识――例如文件锁。

作者: Ven   发布时间: 2008-03-13

第二题答案有点古怪:

作者: iptton   发布时间: 2008-03-13

现占个座,再慢慢看,这个系列我很喜欢的说

作者: ct_174880859   发布时间: 2008-03-13

2题应该是A吧

作者: hexiangyun   发布时间: 2008-03-14

改过来了

[ 本帖最后由 Ven 于 2008-3-14 01:54 编辑 ]

作者: Ven   发布时间: 2008-03-14

作者: spjhf   发布时间: 2008-03-14

作者: grac   发布时间: 2008-03-14

┴┬┴┬/ ̄\_/ ̄\
┬┴┬┴��  ����������\
┴┬┴/\ /      ��
┬┴�M       /   )
┴┬��        ●  ��
┬┴��           ���� 加油!!
┴��������      /\__/
┬������������       /   
┴���������������������������� 
�������������������������������}�{
����������������������������������\  
������������ ������������������   \
┴���������� ��������������      ��
┬│   │������������        ��
┴│   │              ��
┬�M   �M    /������\     �M
*�M___/��   �M      \  /\
┴┬┴┬┴┬┴ \___\     ��/��\��/��\
▲△▲▲�W�i�i�i�i�i�i�i�i\   �M  /���� /��
 ***�d�p�p�p�p�p�p�p�p*��  /  //  /
(\/)*(\/)** △▲▲��/__//__

作者: jefsun   发布时间: 2008-03-14

老样子,错一半。。。。。

作者: linvo   发布时间: 2008-03-14

继续收藏!!

作者: naodai   发布时间: 2008-03-19

发现不足是好事啊,这样学习才更有针对性.

作者: PHPChina   发布时间: 2008-03-20

基础太重要了.....

作者: chcn001   发布时间: 2008-03-20

最有价值的坛子成员

作者: lucas1860   发布时间: 2008-03-20

再次全军覆没...

作者: zwws   发布时间: 2008-03-21

引用:
原帖由 zwws 于 2008-3-21 12:39 发表
再次全军覆没...
这样你不就有压力了,呵呵,找到努力的方向了.

作者: PHPChina   发布时间: 2008-03-21

要是能加快点儿更新速度就更完美了

作者: hexiangyun   发布时间: 2008-03-21

zwws是我忠实的读者

作者: Ven   发布时间: 2008-03-22

作者: luzhou   发布时间: 2008-03-22

引用:
原帖由 Ven 于 2008-3-22 14:35 发表
zwws是我忠实的读者

作者: luzhou   发布时间: 2008-03-22

作者: kinomn   发布时间: 2008-03-26

第13题的D选项为什么不对?测试都没有问题

作者: x334   发布时间: 2008-03-27

作者: luzhou   发布时间: 2008-03-27

引用:
原帖由 x334 于 2008-3-27 17:57 发表
第13题的D选项为什么不对?测试都没有问题
没错,13题如果直接测试,结果是true。但事实上,a(不带引号的)表示常量,如果这个常量在之前定义过了,那么结果就是false了。因此,该表达式的值并不永远是true,所以它不是正确答案。

[ 本帖最后由 Ven 于 2008-3-28 21:59 编辑 ]

作者: Ven   发布时间: 2008-03-28

退步了,对了3道。。

作者: Fevan   发布时间: 2008-04-10

嘿嘿,第一次晓得了'top'==0;为什么?就这样

作者: Fevan   发布时间: 2008-04-10

作者: ppxz2008   发布时间: 2008-04-23