阅读网 购物 网址 万年历 小说 | 三丰软件 天天财富 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
佛经: 故事 佛经 佛经精华 心经 金刚经 楞伽经 南怀瑾 星云法师 弘一大师 名人学佛 佛教知识 标签
名著: 古典 现代 外国 儿童 武侠 传记 励志 诗词 故事 杂谈 道德经讲解 词句大全 词句标签 哲理句子
网络: 舞文弄墨 恐怖推理 感情生活 潇湘溪苑 瓶邪 原创 小说 故事 鬼故事 微小说 耽美 师生 内向 易经 后宫 鼠猫 美文
教育信息 历史人文 明星艺术 人物音乐 影视娱乐 游戏动漫 | 穿越 校园 武侠 言情 玄幻 经典语录 三国演义 西游记 红楼梦 水浒传
 
  首页 -> 小说文学 -> (原创)郎朗的计算机文学 -> 正文阅读

[小说文学](原创)郎朗的计算机文学[第2页]

作者:langlangname
首页 上一页[1] 本页[2] 下一页[3] 尾页[4] [收藏本文] 【下载本文】
    不好意思,之前文章末尾处的/\$\d+\g原书中是打印错误,应该纠正为/\$\d+/g
    PHP为使用Perl兼容的正则表达式搜索字符串提供了7个函数,包括preg_grep(),preg_match(),preg_match_all(),preg_quote(),preg_replace(),preg_replace_callback()和preg_split()。下面将介绍这些函数。
    preg_grep()函数搜索数组中的所有元素,返回由与某个模式匹配的所有元素组成的数组。其形式为:
    array preg_grep(string pattern,array input [,flags])
    考虑一个例子,它使用这个函数在数组中搜索以p开头的食物:
    <?php
    $foods=array(“pasta”,”steak”,”fish”,”potatoes”);
    $food=preg_grep(“/^p/”,$foods);
    其中/^p/代表匹配以p开头的字符串,preg_grep(“/^p/”,$foods)代表从$foods数组中搜索以p开头的元素。
    print_r($food);
    ?>
    这会返回:
    Array ([0]=>pasta [3]=>potatoes)
    preg_match()函数在字符串中搜索模式,如果存在则返回TRUE,否则返回FALSE,其形式为:
    int preg_match(string pattern,string string [, array matches] [,int flags[,int offset>)
    可选的输入参数matches可以包含搜索模式中包含的子模式的各个部分(如果有的话)。下面的例子使用preg_match()完成一个不区分大小写的搜索:
    <?php
    $line=”vim is the greatest word processor ever created!”;
    if(preg_match(“/\bVim\b/i”,$line,$match)) print “Match found!”;
    这个脚本中的正则表达式/\bVim\b/i代表以Vim开头同时也以Vim结尾,修饰符i代表不区分大小写。这个脚本在定位到单词Vim或vim时确定一次匹配,而不匹配simplevim,vims或evim。
    ?>
    preg_match_all()函数在字符串中匹配模式的所有出现,以便通过可选的参数order所指定的顺序,将每次出现放在某个数组中。其形式为:
    int preg_match_all(string pattern,string string,array pattern_array[,int order])
    下面的例子使用了preg_match_all()来查找所有在粗体HTML标记中的字符串:
    <?php
    $userinfo=”Name: Zeev Suraski <br> Title:PHP Guru”;
    preg_match_all(“/(.*)<\/b>/U”,$userinfo,$pat_array);
    printf(“%s <br/> %s”,$pat_array[0][0],$pat_array[0][1]);
    ?>
    正则表达式/(.*)<\/b>/U中的(.*)<\/b>匹配所有粗体HTML标记中的字符串,修饰符U代表第一次匹配后停止。
    之前的那一段代码会返回:
    Zeev Suraski
    PHP Guru
    其实你会惊喜地发现原先代码中粗体HTML标记中的字符串都打印了出来。而之外的Title:还有换行符还有Name:都被正则表达式过滤掉了。

    函数preg_quote()在每个对于正则表达式语言而言有特殊含义的字符前插入一个反斜线。这些特殊字符包括:$ ^ * ( ) + = { } [ ] | \\ : < >。其形式为:
    string preg_quote(string str[, string delimiter])
    可选参数delimiter用于指定用于正则表达式的定界符,使用它也要用反斜线转义。例子如下:
    <?php
    $text=”Tickets for the bout are going for $500.”;
    echo preg_quote($text);
    ?>
    以上这段代码会返回
    Tickets for the bout are going for \$500\. 通过preg_quote函数对$text中的字符串进行处理,在美元符$和英文句号结束符.前面全部加上了一个反斜线\,之所以加上反斜线是因为这两个符号在正则表达式里面都有特殊含义,所以要加上反斜线来转义。

    preg_replace()函数与ereg_replace()相同,只不过它基于Perl的正则表达式语法,用replacement替换pattern的所有出现,并返回修改后的结果。其形式为:
    mixed preg_replace(mixed pattern,mixed replacement,mixed str[, int limit])
    可选的输入参数limit指定应当发生多少次匹配。不设置limit或设置为-1将替换所有出现的情况。例子如下:
    <?php
    $text=”This is a link to http://www.wjgilmore.com/.”;
    echo preg_replace(“/http:\/\/(.*)\//”, “<a href=\”\${0}\”>\${0}</a>”,$text);
    ?>
    其中的正则表达式/http:\/\/(.*)\//中其实就是用反斜线对http地址中的//和/进行转义,同时其中的(.*)包含一个或多个字符,也就是匹配到了www.wjgilmore.com这个url地址。同时代码中之后的\${0}原样引用到了之前的url地址,\”对双引号”进行了转义。
    非常有趣的是,输入参数pattern和replacement还可以是数组。这个preg_replace函数将循环处理每个数组的每个元素,一旦找到就进行替换。
    考虑下面一个例子:
    <?php
    $draft=”In 2007 the company faced plummeting revenues and scandal.”;
    $keywords=array(“/faced/”,”/plummeting/”,”/scandal/”);
    $replacements=array(“celebrated”,”skyrocketing”,”expansion”);
    echo preg_replace($keywords,$replacements,$draft);
    ?>
    以上代码会返回:
    In 2007 the company celebrated skyrocketing revenues and expansion.
    其实可以看到原先$draft中的跟$keywords数组匹配的关键字都被替换为了$replacements数组中的关键字。

    当然还可以创建一个定制函数,然后使用preg_replace_callback()暂时将其放入该语言中。
    其形式为:
    mixed preg_replace_callback(mixed pattern,callback callback,mixed str[,int limit])
    参数pattern确定要寻找的字符串,参数str定义所搜索的字符串。参数callback定义用于完成替换任务的函数名。可选参数limit指定要进行多少次匹配。如果不设置limit或设置为-1,则替换所有出现。

    下面的例子中,将名为acronym()的函数传递给preg_replace_callback(),用来向目标字符串中插入各个同义词的长形式。
    //下面的这个函数将直接添加acronym的长形式在任何从$matches中发现的acronyms之后。
    function acronym($matches){
    $acronyms=array(
    ‘WWW’=>’World Wide Web’,
    ‘IRS’=>’Internal Revenue Service’,
    ‘PDF’=>’Portable Document Format’);
    if(isset($acronyms[$matches[1]]))
    通过isset函数判断$acronyms所对应的$match数组中是否已经有了值,如果就返回相应的值。
    return $matches[1].”(”.$acronyms[$matches[1]].”)”;
    else
    return $matches[1];
    }
    //以下是目标文本
    $text=”The <acronym>IRS<acronym>offer tax forms in <acronym>PDF</acronym> format on the
    <acronym>WWW</acromym>.”;
    //添加acronym的长形式到目标文本中
    $newtext=preg_replace_callback(“/<acronym>(.*)<\/acronym>/U”,’acronym’,$text);
    print_r($newtext);
    其中正则表达式/<acronym>(.*)<\/acronym>/U匹配任何<acronym><acronym>中的多个字符串,而且修饰符是U,也就是第一次匹配后停止。其实匹配之后,在相应的字符串后面加上acronym函数中的$acronyms数组中相应的键所对应的相应的值。
    ?>
    以上代码会返回:
    The IRS(Internal Revenue Service) offerss tax forms in PDF(Portable Document Format) on the WWW(World Wide Web).
    相应的长形式以(内容)的方式插入在相应的缩写后面。
    preg_split()函数与split()相同,只是pattern也可以按正则表达式定义。其形式为:
    array preg_split(string pattern,string string[,int limit [,int flags]])
    如果指定了可选的输入参数limit,就返回limit个子串。考虑下面这个例子:
    <?php
    $delimitedText=”Jason+++Gilmore+++++++++++Columbus+++OH”;
    $fields=preg_split(“/\+{1}/”,$delimitedText);
    其中,正则表达式/\+{1}/代表至少有一个+加号。其实是通过preg_split函数将字符串$delimitedText中的加号去掉,并分割为四个子串。
    foreach($fields as $field) echo $field.”<br/>”;通过foreach函数将分割之后的四个子串打印输出。
    ?>
    以上代码返回如下结果:
    Jason
    Gilmore
    Columbus
    OH
    以上这些正则表达式的例子结束之后,其实,你会惊喜地发现,其实,正则表达式只是一种表达计算机中PHP情感的,别样的方式。看上去复杂,其实,这种复杂中透露着简单和真挚。如果,你愿意认为这些是值得你去认真,去执着的那些事情的话。很多时候,学习正则表达式,看上去有点痛苦,但,就是这样,苦中带有着很多的快乐。快乐这种东西,本来就可以通过这些元字符,通过这些修饰符来加以修饰,让自己的人生和学习生涯变得更加充实同时也更加完整。其实,我们都是可以通过这些代码来成长的。如果,你愿意认为,同时你也能够认为你值得这样来成长的话,你其实就已经成功了。
    各位,不好意思,这是我教程中原先内容中的HTML粗标签在起作用,所以会有大部分显示为粗体。preg_match_all(“/(.*)<\/b>/U”,$userinfo,$pat_array);代码中(*)前还有一个HTML粗文本标记。
    天涯论坛确实极品,我真是服了。
    各位,不好意思,这个帖子里面因为刚才更新的代码里面有HTML粗文本标签,以后这个帖子因为之前更新的代码中的内容,都要显示为粗体了。但是在其他帖子里面没有影响的。天涯论坛我真是无语了。
    顶
    顶
    无数应用程序中都有确定字符串长度的工作。PHP函数strlen()能够非常完美地完成这个任务。其实非常好理解,strlen可以理解为是stringlength的英文缩写。此函数返回字符串的长度,字符串中的每个字符相当于一个单位。其形式为:
    int strlen(string str)
    下面的例子要验证用户密码的长度是否可以接受:
    <?php
    $pswd=”secretpswd”;
    if(strlen($pswd)<10)
    通过strlen长度判断$pswd中的字符串的长度是否少于10个字符,如果是就实现打印输出
    echo “Password is too short!”;
    打印密码太短了。
    else
    echo “Password is valid!”;
    打印密码是有效的。
    ?>
    这里,最后打印输出的时候“打印密码太短了。”这一段错误消息不会出现。因为所选的密码由10个字符组成。
    strcmp()函数对两个字符串进行二进制安全的比较,并区分大小写。其形式为:
    int strcmp(string str1,string str2)
    根据比较的结果将返回如下的一个可能值。
    如果str1和str2相等则返回0。
    如果str1小于str2则返回-1。
    如果str1大于str2则返回1。
    <?php
    $pswd=”supersecret”;
    $pswd2=”supersecret2”;
    if(strcmp($pswd,$pswd2)!=0)
    通过strcmp函数判断两个密码变量$pswd和$pswd2的比较结果是否不等于0,,也就是两个密码变量不相等,则打印输出如下语句,密码不匹配。
    echo “Passwords do not match!”;
    else
    echo “Passwords match!”;
    打印密码匹配。
    ?>
    注意,对于strcmp(),字符串必须完全匹配才认为是相等的。例如,Supersecret不同于supersecret。大小写这种形式好像看似有一点点的不同,但其实这种不同都是能够被理解的。就好像小孩和大人一样,当然,strcmp()对于这种所谓的大小写,小孩和大人的这种区分是非常严格的。就像特种兵和普通士兵一样,看上去好像没有什么差别,但其实,就是因为有一点点的不同,所以,差距就出现了。

    如果要以不区分大小写的方式比较两个字符串,可以考虑如下的strcasecmp()。这个函数的形式为:
    int strcasecmp(string str1,string str2)
    <?php
    $email1=”admin@example.com”;
    $email2=”ADMIN@example.com”;
    if(!strcasecmp($email1,$email2))
    如果strcasecmp判断两个邮件地址不相同的话,则打印输出这两个邮件地址是相同的。
    echo “The email addresses are identical!”;
    ?>
    这里将输出消息The email addresses are identical!,因为strcasecmp()对$email1和$email2会执行不区分大小写的比较,并确定它们实际上是相同的。

    strspn()函数返回一个字符串中包含有另一个字符串中字符的第一部分的长度。其形式为:
    int strspn(string str1,string str2)
    下面的例子使用strspn()确保一个密码不只由数字组成:
    <?php
    $password=”3312345”;
    if(strspn($password,”1234567890”)==strlen($password))
    其实是通过strspn函数判断$password中的3312345中所有的数字字符是不是都在1234567890里有,如果有,则通过strspn返回$password的长度,判断是否与strlen函数返回的长度相同。然后打印输出这个密码不能够单独由数字组成这一段提示文字。
    echo “The password cannot consist solely of numbers!”;
    ?>
    这里将打印输出这一段英文,因为$password确实只由数字组成。

    strcspn()函数返回一个字符串中包含另一个字符串中所没有的字符的第一部分的长度。其形式为:
    int strcspn(string str1,string str2)
    下面是一个使用strcspn()验证密码的例子:
    <?php
    $password=”a12345”;
    if(strcspn($password,”1234567890”)==0){
    通过strcspn判断出$password中有跟1234567890不同的字符a
    echo “Password cannot consist solely of numbers!”;
    }
    ?>
    这里不会打印出以上这一段英文,因为$password不只是由数字组成,其中还有一个a。所以通过strcspn判断之后返回的长度为a字符的长度,也就是1。

    总之,确定字符串长度的上述函数,看上去好像挺简单,但,就是因为这种简单,就能够实现并贯彻出一些不简单。PHP中的函数是占据大头的,正是因为有了这些函数的支撑和支持,PHP才能够变得这么强大。特种兵也是需要不断训练之后才能够成长起来的,PHP的学习者其实跟有志于训练成为特种兵的那些士兵是一样的心态和抱负才是最好的。能够通过这些字符串函数来摸摸底,试探出字符串的一些特性,这或许跟北斗神拳里面能够感受得到强者是一样的道理,也许,我们都应该继续磨练,同时,还附带着谦虚的心态才行啊。
    顶
    strtolower()函数将str全部转换为小写字母,并返回修改后的字符串。非字母字符不受影响。其形式为:
    string strtolower(string str)
    下面的例子使用strtolower()将URL转换为小写字母:
    <?php
    $url=”http://WWW.EXAMPLE.COM/”;
    echo strtolower($url);
    通过使用strtolower函数对$url中的大写字母进行处理。全部转换为小写。
    ?>
    以上代码会返回http://www.example.com/
    当然了,也可以将字符串转换为大写,通过函数strtoupper()来实现。其形式为:
    string strtoupper(string str) ,同样非字母字符不受影响。
    <?php
    $msg=”I annoy people by capitalizing e-mail text.”;
    echo strtoupper($msg);
    ?>
    这会返回:
    I ANNOY PEOPLE BY CAPITALIZIN E-MAIL TEXT.
    其实,不管是转换成小写也好,还是转换成大写也好,PHP之所以提供了这两个函数,只是为了转换的方便而已,就像大人可以有小孩的心态,小孩也可以同样跟大人一样有成熟的心态是一样的道理。都因为这种转化,这种过渡之后,让大人和小孩终于都在某一个瞬间发现,原来,彼此之间的距离其实是非常地近,同时也非常地咫尺。过渡,转化都只是一种借口,关键是在于你到底是如何来正确看待并正视你自己,并同样认真地去对待这些代码。

    如果字符串str的第一个字符是字母,ucfirst()函数则将其变成大写。其形式为:
    string ucfirst(string str)
    非字母字符不受影响。此外,字符串中的任何大写字母也保持不变。
    <?php
    $sentence=”the newest version of PHP was released today!”;
    echo ucfirst($sentence);
    ?>
    这会返回:
    The newest version of PHP was released today!
    确实,你会发现第一个字母确实被大写,不过原来已经大写的单词PHP保持不变。
    ucwords()函数将字符串中每个单词的第一个字母变为大写。其形式为:
    string ucwords(string str)
    非字母字符不受影响。
    <?php
    $title=”O’Malley wins the heavyweight championship!”;
    echo ucwords($title);
    ?>
    这会返回:
    O’Malley Wins The Heavyweight Championship!
    发现$title中每个单词的开头字母通过ucwords函数处理之后都变成了大写。
    注意,如果O’Malley写成了o’malley,ucwords()不会发现问题。
    nl2br()函数将字符串中的所有换行符(\n)转换为XHTML兼容的形式<br/>。其形式为:
    string nl2br(string str)
    下面的例子将文本串转换为HTML格式:
    <?php
    $recipe=”3 tablespoons Dijon mustard
    1/3 cup Caesar salad dressing
    8 ounces grilled chicken breast
    3 cups romaine lettuce”;
    echo nl2br($recipe);
    ?>
    执行这个例子可以得到如下输出:
    3 tablespoons Dijon mustard<br/>
    1/3 cup Caesar salad dressing<br/>
    8 ounces grilled chicken breast<br/>
    3 cups romaine lettuce
    发现原来变量$recipe中有换行的地方通过函数nl2br转换为了<br/>

    其实你通过这些函数,已经发现这些函数的共性了,都是用来转化字符串中的各种形式的。其实,学习这些东西的时候,看似有点枯燥,但好像通过这种枯燥也同样让你收获了许多。其实,学习PHP的过程本来就稍微有点艰苦,但如果苦中作乐的话,你就会发现其实你也能够同样非常认真地来面对这些代码,其实,并不难,难就难在非常认真地继续坚持下去。
    顶
    下面的例子将转换法语中的重音符号è和变音符号?这些必要的字符以便在Web浏览器上显示:
    <?php
    $advertisement=”Coffee at ‘Cafè Fran?aise’ costs $2.25.”;
    echo htmlentities($advertisement);
    ?>
    这会返回:
    Coffee at ‘Cafè Fran?aise’ costs $2.25.
    其实是通过htmlentities函数将$advertisement中的特殊字符è和?转换为了可识别的形式。

    同时,通过htmlspecialchars()函数将特殊的HTML字符转换为可兼容的等价形式,其形式为:
    string htmlspecialchars(string str[, int quote_style [, string charset]])
    htmlspecialchars()可以转换的字符的列表以及其最终的形式如下:
    &变成&
    “(双引号)变成"
    ‘(单引号)变成'
    <变成<
    >变成>
    以下例子使用了htmlspecialchars()来转换有害的字符:
    <?php
    $input=”I just can’t get <<enough>> of PHP!”;
    echo htmlspecialchars($input);
    ?>
    查看源代码,将看到:
    I just can’t get <<enough>> of PHP &!
    如果转换不是必须的,可能更有效的方式是使用strip_tags(),它将删除字符串中的标记。

    <?php
    $string=”La pasta é il piatto piú amato in Italia”;
    $translate=get_html_translation_table(HTML_ENTITIES);
    echo strtr($string,$translate);
    ?>
    其实以上代码是通过get_html_translation_table()将$string中的文本转换为HTML等价形式。
    然后再用strtr()函数将$string中的文本转换为相应的HTML代码。
    以上代码会返回在浏览器上输出而做了必要格式化之后的字符串:
    La pasta é il piatto piú amato in Italia
    其实也就是将两个法文符号é和ú转换为了HTML代码中的é和ú
    下一个例子使用array_flip()将一个字符串恢复为最初的值:
    <?php
    $entities=get_html_translation_table(HTML_ENTITIES);
    $translate=array_flip($entities);
    $string=”La pasta é il piatto piú amato in Italia”;
    echo strtr($string,$translate);
    ?>
    以上代码将返回如下结果:
    La pasta é il piatto piú amato in Italia

    strtr()函数将字符串中的所有字符转换为某个预定义数组中的相应值。其形式为:
    string strtr(string str,array replacements)
    下面的例子将已经废弃的粗体字符(<br>)转换相应的XHTML形式:
    <?php
    $table=array(“”=>”<strong>”,””=>”</stong>”);
    $html=”Today IN PHP-Powered News”;
    echo strtr($html,$table);
    ?>
    以上代码返回如下结果:
    <strong>Today IN PHP-Powered News</strong>
    其实也是通过strtr函数将相应的html粗体标记转换为了<strong>
    strip_tags()函数删除字符串中的所有HTML和PHP标记,只剩下文本实体。其形式为:
    string strip_tags(string str [ , string allowable_tags])
    下面的例子使用strip_tags()删除字符串中的所有HTML标记:
    <?php
    $input=”Email <a href=’spammer@example.com’>spammer@example.com</a>”;
    echo strip_tags($input);
    ?>
    返回如下结果:
    Email spammer@example.com
    发现之前$input中的链接地址已经被strip_tags()函数给去除掉了。
    下面的例子删除<a>标记之外的所有标记:
    <?php
    $input=”This <a href=’http://www.example.com/’>example</a>
    Is awesome!”;
    echo strip_tags($input,”<a>”);
    ?>
    返回如下结果:
    This <a href=’http://www.example.com/’>example</a> is awesome!

    其实,讨论了这么多,作为读者的你会突然发现原来法文字符是这么地奇怪,竟然跟中文的拼音是这么的像,同时你也终于发现原来PHP这一门语言的开发者考虑确实很周到,很细致,至少是有这些用来处理这些特殊字符的函数来作为处理这些特殊字符的方式。其实,这些特殊字符就像我们人群中一些看似性格很古怪,很孤僻的人一样,确实,都是一样的道理,无法融入人群的时候,调用一下你所认为的你能够跟这些人打成一片的方式或者是手段,让自己通过PHP的学习,同时也通过PHP来感受自己的人生,通过自己给自己所定义出的那些特殊,让自己终于在某一个瞬间终于意识到,原来,很多时候,性格古怪或者是孤僻有时候反而是一种优点或者是优势,通过这种优点,通过这种优势,让很多个读者的你突然发现原来特殊字符仅仅只是一种表现的手段,我们,不仅仅因为特殊,我们也应该通过习惯这种特殊,来更深一层次地感悟我们今后的看似同样特殊的,唯一的人生。其实我们可以定义出转换我们特殊人生的那些我们所认为的,对于我们而言非常重要的那些人生转换函数。大家是说吧,哈哈,开玩笑了。

    以上代码纠正一下,$table=array(“”=>”<strong>”,””=>”</strong>”);
    这一行代码中的两对双引号之内漏掉了HTML中的粗体开始和粗体结束符。在天涯论坛显示不出来是老毛病了。原来代码后面这个</strong>被我给打错了。不好意思。

    $html=”Today IN PHP-Powered News”;这一行代码的双引号之内也是缺了HTML中的粗体的开始和粗体的结束符。
    同时,我还发现刚才更新的这一段文字中有关于法文字符转换的问题,特殊字符的转换标记都没有能够在天涯论坛正常显示。大家可以将PHP代码拷到自己的PHP环境,就比如WAMP环境下看显示的效果。
    顶
    顶
    顶
    strtok()函数根据预定义的字符列表来解析字符串。其形式为:
    string strtok(string str,string tokens)
    <?php
    ?$info=”J.Gilmore:jason@example.com|Columbus,Ohio”;
    $tokens=”:|,”;
    定义三个分隔符用来分隔$info中的字符串
    $tokenized=strtok($info,$tokens);
    在$tokenized数组中打印每一个元素
    while($tokenized){
    ? echo “Element=$tokenized<br>”;
    在随后的对strtok函数的调用中不包括第一个参数$info。
    ? $tokenized=strtok($tokens);
    }
    ?>
    以上代码会返回如下结果:
    Element=J.Gilmore
    Element=jason@example.com
    Element=Columbus
    Element=Ohio
    explode()函数将字符串str分成子串数组,其形式为:
    array explode(string separator,string str [ ,int limit])
    <?php
    ? $summary=<<<summary
    ?In the latest installment of the ongoing Developer.com PHP series,
    I discuss the many improvements and additions to
    <a href= >PHP 5’s</a >object-oriented architecture.
    Summary;
    $words=sizeof(explode(‘ ’,strip_tags($summary)));
    通过strip_tags函数剥去字符串$summary中的HTML和PHP的标签。然后通过explode函数以空格作为分隔符进行分割,最后通过sizeof函数计算分隔之后到底有多少个字符。
    echo “Total words in summary:$words”;
    ?>
    以上代码会返回:
    Total words in summary:22
    implode()函数可以将数组元素连接形成一个定界字符串。其形式为:
    string implode(string delimiter,array pieces)
    下面的例子根据数组元素构成一个字符串:
    <?php
    ? $cities=array(“Columbus”,”Akron”,”Cleveland”,”Cincinati”);
    ? echo implode(“|”,$cities);
    ?>
    以上代码会返回:
    Columbus|Akron|Cleveland|Cincinati
    其实通过implode函数将$cities中的数组元素以|作为分割连接在一起了。其实你可以理解为是一种友情的连接,因为这种友情的分隔方式并不一定相同,有非常多的转化方式,然后,慢慢地,友情积累,积聚之后,就变成了非常强大,非常有力量的一股能量。
    strpos()函数在字符串中以区分大小写的方式找到substr第一次的出现。
    int strpos(string str,string substr[, int offset])
    以下例子将确定第一次访问index.html的时间戳:
    <?php
    ? $substr=”index.html”;
    ?$log=<<<logfile
    192.168.1.11:/www/htdocs/index.html:[2006/02/10:20:36:50]
    192.168.1.13:/www/htdocs/about.html:[2006/02/11:04:15:23]
    192.168.1.15:/www/htdocs/index.html:[2006/02/15:17:25]
    logfile;
    $pos=strpos($log,$substr);
    通过strpos函数找到$log中时间的第一次出现
    $pos2=strpos($log,”\n”,$pos);
    通过strpos函数找到行末的数字位置
    $pos=$pos+strlen($substr)+1;
    计算时间戳的开头所在部位
    $timestamp=substr($log,$pos,$pos2-$pos);
    找回时间戳
    echo “The file $substr was first accessed on:$timestamp”;
    ?>
    以上代码将返回第一次访问文件index.html的位置:
    The file index.html was first accessed on:[2006/02/10:20:36:50]
    其实敲代码敲到现在,我终于开始发现其实这些字符串的处理函数都只是一种工具和手段,关键是如何通过自己的思考方式将这些函数组合并形成一定的作用。我们必然要通过这些函数来写出属于我们自己的类,但其实,这通过以上这些教程的学习之后,会发现并不是非常难,我们只是应该通过我们自己的认真来定义出属于我们今后的看似还非常漫长的以后。这些字符串处理函数,看似单调,看似乏味,但其实通过这种单调和乏味其实让我们都成长了许多,同时也成熟了许多。也许,我们在必然无法避免的时间的轮回中,开始慢慢忽略我们人生中必然无法真正避免的东西,当然,我们都应该想通并彻底释然很多事。我们开始学会通过PHP中的这些字符串处理函数来处理我们人生中的字符串。我们应该通过这些函数想起我们应该通过我们的现实来必然积累一些东西,也必然能够总结出一些东西。如果可以的话,请把之前的这本书中的教程认认真真地细读几遍,相信,会对读者的你有非常大的帮助。我们其实现实中看似琐碎的生活片段,也可以通过我们自己现实中所能够定义的有关于人生的字符串处理函数进行处理,让我们的人生变得更加与众不同起来。
    各位,不好意思。刚才帖子莫名其妙被删除了。天涯论坛用电脑无法访问了,用微信发的。代码有一部分无法显示,非常抱歉。等天涯论坛电脑能访问了我重发一遍。
    昨天用微信发的这一段文字有部分代码在我的手机里显示不正常。电脑显示是正常的。
    strrpos()函数搜索字符串的最后一次出现,返回它的位置(数值序号)。其形式为:
    int strrpos(string str, char substr [, offset])
    <?php
    $limit=100;
    将$summary中的内容限定为多少个字符。
    $summary=<<< summary
    In the lastest installment of the ongoing Developer.com PHP series,
    I discuss the many improvements and additions to
    <a href=”http://www.php.net”>PHP 5’s</a>object-oriented
    architecture.
    summary;
    if(strlen($summary)>$limit)
    通过strlen函数判断$summary中的内容是否大于$limit中的100个字符的限制。
    $summary=substr($summary,0,strrpos(substr($summary,0,$limit),’ ‘)).’...’;
    其实是通过substr跟strrpos函数的配合使用,将$summary中的前100个字符显示出来,后面的部分用省略号...代替。
    echo $summary;
    ?>
    这会返回:
    In the latest installment of the ongoing Developer.com PHP series,I discuss the many...
    str_replace()函数以区分大小写的方式用另外一个字符串替换某个字符串的所有实例。其形式为:
    mixed str_replace(string occurence,mixed replacement, mixed str [, int count])
    以下这个例子是自动获取电子邮件地址程序隐藏电子邮件地址:
    <?php
    $author=”jason@example.com”;
    $author=str_replace(“@”,”(at)”,$author);
    其实是通过str_replace函数将$author中的@替换为at。
    echo “Contact the author of this article at $author.”;
    ?>
    以上代码会返回:
    Contact the author of this article at jason(at)example.com.
    strstr()函数返回字符串中从预定义的字符串的第一个出现开始的剩余部分。其形式为:
    string strstr(string str,string occurence)
    下面的例子使用strstr函数并结合ltrim()函数来获得电子邮件地址中的域名:
    <?php
    $url=”sales@example.com”;
    echo ltrim(strstr($url,”@”),”@”);
    通过调用strstr函数从$url中获得@之后的字符串。然后再用ltrim函数去掉剩余字符串中的@字符。
    ?>
    以上代码返回如下结果:
    example.com
    substr()函数返回字符串中位于start和start+length之间的部分。其形式为:
    string substr(string str,int start [, int length])
    考虑一个基本例子:
    <?php
    $car=”1944 Ford”;
    echo substr($car,5);
    ?>
    这会返回如下结果:
    Ford
    其实很好理解,通过substr函数从$car中从第6个字符开始截取,也就是从F开始截取,然后就获得了Ford。
    <?php
    $car=”1944 Ford”;
    echo substr($car,0,4);
    其实是通过调用substr函数从$car中从第1个字符开始,截取4个字符。也就是1944。
    ?>
    返回如下结果:
    1944
    最后一个例子使用负的length参数。
    <?php
    $car=”1944 Ford”;
    $yr=echo substr($car,2,-5);
    其实是通过substr从$car的第三个字符开始,截取到倒数第5个字符。?>
    这会返回:
    44
    substr_count()返回一个字符串在另一个字符串中出现的次数。其形式为:
    int substr_count(string str,string substring)
    下面的例子确定了一名IT顾问在其陈述中使用术语的次数:
    <?php
    $buzzwords=array(“mindshare”,”synergy”,”space”);
    $talk=<<< talk
    I’m certain that we could dominate mindshare in this space with
    our new product,establishing a true synergy between the marketing
    and product development teams.We’ll own this space in three months.
    talk;
    foreach($buzzwords as $bw){
    echo “The word $bw appears”.substr_count($talk,$bw).”time(s).<br/>”;
    通过foreach循环语句,对$buzzwords数组中的每个元素$bw,通过substr_count()函数计算$buzzwords数组中的各个元素出现的总字数。
    }
    ?>
    以上代码返回如下结果:
    The word mindshare appears 1 time(s).
    The word synergy appears 1 time(s).
    The word apace appears 2 time(s).
    substr_replace()函数将字符串中的一部分用另一个字符串替换。其形式为:
    string substr_replace(string str, string replacement, int start [, int length])
    <?php
    $ccnumber=”1234567899991111”;
    echo substr_replace($ccnumber,”************”,0,12);
    其实通过substr_replace函数将$ccnumber的前十二位字符全部替换为了*号。
    ?>
    以上代码会返回:
    ************1111
    其实代码敲打到现在,作为读者的你和写作者的我会惊喜地发现,其实,代码写多了之后,会有一种直觉,好像对函数的那些理论性的说明都好像并不是那样地难理解。我们只是缺少了一种实践的方式和手段,当我们觉得这个函数的理论性描述太过于难理解的时候,通过代码的例子来通过写代码的这种实践的方式,让我们终于发现,原来很多时候,我们原本无法真正理解的那些东西,都开始变得稍微有点奇怪,同时也能够让我们感悟更多。其实,计算机文学,说穿了,只是一种表现的方式,如果读者的你认为这本书有用,这本书就是非常有价值的,同时,也是非常珍贵的一笔精神财富。当然,我想,我们都应该通过我们自己的理解来理解PHP,如果,我们真正开始喜欢上PHP这一门语言的话,那我们就真正地成功了。在距离我们人生目标越来越近的时候,我们就必然会犯一些错误,但是,我想,我们必然是能够克服这些缺点或者是错误的。大家说是吧。
    顶
    ltrim()函数从字符串的开始处剔除一些字符,包括空格符,水平制表符(\t),换行,回车(\r),空值(\0)和垂直制表符(\x0b)。其形式为:
    string ltrim(string str[, string charlist])
    rtrim()函数与ltrim()相同,只是它从str的右侧删除字符。其形式为:
    string rtrim(string str[, string charlist])
    可以认为trim()函数是ltrim()和rtrim()的组合。它从字符串的两侧删除指定的字符。其实你可以这样来理解这个函数,我需要朋友,但是我需要我通过我自己的意志能够最大化结交到的那些朋友们,通过我自己的意志来判断或者是掌控的那些朋友们。那些朋友们,通过空白一样的空格字符出现在我面前,同时也通过我意志中的去空格函数,将这些朋友固定化在我的意识深处里。大家可以这样来理解。
    string trim(string str[, string charlist])
    str_pad()函数将字符串用指定个数的字符填充字符串。其形式为:
    string str_pad(string str, int length [, string pad_string [, int pad_type]])
    <?php
    echo str_pad(“Salad”,10).”is good.”;
    ?>
    这会返回如下结果:
    Salad is good.
    其实是通过strpad函数在Salad的右侧填充了10个空白字符。str_pad函数如果没有定义可选参数pad_string,将默认使用空格填充。

    <?php
    $header=”Log Report”;
    echo str_pad($header,20,”=+”,STR_PAD_BOTH);
    ?>
    这会返回:
    =+=+=Log Report=+=+=
    其实是通过str_pad函数在$header两侧填充了20个字符。也就是两侧各五个符号。
    函数count_chars()提供了关于字符串中字符数的信息。其形式为:
    mixed count_chars(string str [, mode])
    以下例子计算$sentence中每个字符的频率:
    <?php
    $sentence=”The rain in Spain falls mainly on the plain”;
    //找回所在的字符还有它们相应的频率
    $chart=count_chars($sentence,1);
    count_chars函数中通过指定可选参数mode为1,只返回频率大于0的字节/值。

    foreach($chart as $letter=>$frequency)
    echo “Character”.chr($letter).”appears $frequency times<br/>”;
    通过foreach循环语句将$chart中通过count_chars函数处理好之后的$sentence中的字符串,将相应的key和value指定为$letter和$frequency。然后再通过chr函数从$letter里面返回相应的字符。然后在echo语句里面显示并调用。然后相应的字符和频率都正常显示了出来。
    ?>
    以上代码返回如下结果:
    Character appears 8 times
    Character S appears 1 times
    Character T appears 1 times
    Character a appears 5 times
    Character e appears 2 times
    Character f appears 1 times
    Character h appears 2 times
    Character i appears 5 times
    Character l appears 4 times
    Character m appears 1 times
    Character n appears 6 times
    Character o appears 1 times
    Character p appears 2 times
    Character r appears 1 times
    Character s appears 1 times
    Character t appears 1 times
    Character y appears 1 times
    有时候你会认为以上的这些函数好像有点多余,有点累赘,但其实,这些多余和累赘是为了让PHP变成更加充实的同时,还能够让学习者的我们都意识到,原来,很多时候,看似理解了某些看似简单的事物,但这些事物一直以来都是看似没有多大意义和价值的。有时候翻翻微信好友,会发现有些人屏蔽了朋友圈,而有些是三天或者是一个月,其实,都只能够说明其实人心也一样复杂,一样看似繁琐在你所能够定义的复杂里。PHP以上的这些函数,看似简单,看似稍微有点麻烦,但是,这些,让PHP这一门语言能够变得更加充实,同时也让我们的学习生活变得更加充实和有意义起来。
    顶
    函数str_word_count()提供关于str中单词总数的信息,其形式为:
    mixed str_word_count(string str [, int format])
    <?php
    $summary=<<<summary
    In the latest installment of the ongoing Developer.com PHP series,
    I discuss the many improvements and additions to PHP 5’s
    object-oriented architecture.
    summary;
    $words=str_word_count($summary);
    通过str_word_count函数计算$summary中的总单词数。
    printf(“Total words in summary:%s”,$words);
    然后通过printf函数打印一段英文,并以字符串的格式显示$words。
    ?>
    以上代码会返回如下结果:
    Total words in summary:23
    <?php
    $summary=<<< summary
    In the latest installment of the ongoing Developer.com PHP series,
    I discuss the many improvements and additions to PHP 5’s
    object-oriented architecture.
    summary;
    $words=str_word_count($summary,2);
    通过str_word_count函数计算$summary中的单词数,2其实就意味着返回的是一个关联数组,包含相应的键和值所对应的信息。
    $frequency=array_count_values($words);
    通过array_count_values函数统计数组$words中所有单词出现的次数,并返回相应的值给$frequency。
    print_r($frequency);
    ?>
    以上代码返回如下结果:
    Array([In]=>1 [the]=>3 [latest]=>1 [installment]=>1 [of]=>1
    [ongoing]=>1 [Developer]=>1 [com]=>1 [PHP]=>2 [series]=>1
    [I]=>1 [discuss]=>1 [many]=>1 [improvements]=>1 [and]=>1
    [additions]=>1 [to]=>1 [s]=>1 [object-oriented]=>1
    [architecture]=>1)
    很容易看出代码的显示结果就是一组相对应的key和value值,而且计算出了每个单词出现的频率,其实,在人生中,我们也有一定的频率会遇到对于我们而言重要的那个人或者那件事物,我们其实都应该好好珍惜的同时让我们自己清醒地意识到,原来很多时候,我们看似好像不是很了解我们自己,但其实我们一直都在我们所能够定义的那个场合和情境下变得越来越复杂,其实我们应该计算出我们会爆发忧郁的那种频率,在我们自己的工作和学习过程中,我们都不应该轻言放弃,同时,我们也不容易轻易释怀很多事,如果,我们愿意认为我们应该彻底放下或者是想到一些事的话,那或许,我们,就看似好像是成功的,我们确实应该定义出我们自己所能够认为的,在我们人生中那些重要的人,事,物能够以一定频率出现在我们的视线中和脑海里的话。那我们,就应该看似是成功的。

    其实Validate_US这个包只需快速查找PEAR就会发现,这个包能够验证各种美国特有的信息项。当然,Validate_US仍处于beta阶段,但这个包能够从语法上验证电话号码,社会保险号,州缩写和ZIP编码。

    例如,假如希望验证一个电话号码,只需包含Validate_US类,并调用phoneNumber():
    <?php
    include “Validate/US.php”;
    $validate=new Validate_US();
    echo $validate->phoneNumber(“614-999-9999”)?”Valid!”:”Not valid!”;
    ?>
    因为phoneNumber中,614-999-9999这个电话号码在Validate_US这个类中是有效的电话号码的形式。所以这个例子会返回Valid!消息。也就是布尔值为真。相反,给phoneNumber()提供614-876530932会告知用户这是一个无效的电话号码。其实,有时候你会莫名其妙发现一些匿名的或者是骗子之类的电话,而且显示的时候已经提示你是欺诈了,这种电话就不应该接听,当然,我们这个社会,不知道从什么时候开始起就变得骗子越来越多,当然,我其实今年七月份的时候就因为找兼职的一件事被骗了138元,还到派出所去报了案,最后还是不了了之,这个社会,充斥着太多负面的东西,但我们应该能够正视并克服这种负面,同时,我们也会通过这种克服的过程,让我们自己变得越来越灵活,同时,我们也能够同样更加深入地去了解我们自己。
    将相关的数据组织为文件和目录等实体,这一直是计算环境的核心概念。将目录路径解析为各个属性通常很有用,如末尾的扩展名,目录部分和基本名。其实读书的时候阅读目录未尝不是一种了解自己兴趣爱好阅读的点在哪里的方式,阅读有时候跟人生阅历也有点关系,当然,其实,我们都应该学会适应我们看似枯燥的人生中的目录和情感经历。情感可以因为我们自己人生中的沉淀而能够有更好的表现的方式,我们只是为了让我们自己今后的人生和情感心得的矛盾和权衡之后,让我们在某一刻突然发现,原来,我们人生中的情感目录也是参差不齐地呈现在我们所能够认为的现实里和梦境中,如果,我们都愿意认为我们自己应该这样来获得,我们就应该能够有所收获,同时也有所积累并收集一些我们所能够认为的,对于我们有意义的一些PHP的相关函数。

    basename()函数返回路径的文件名部分。其形式为:
    string basename(string path [, string suffix])
    <?php
    $path=”/home/www/data/users.txt”;
    其实/home是在linux系统中的目录结构,PHP通常很多时候跟linux系统混搭在一起,大家要学会习惯和适应。
    printf(“Filename:%s <br/>”,basename($path));
    通过basename函数返回$path中的路径文件名部分users.txt。
    printf(“Filename sans extension: %s <br/>”,basename($path,”.txt”);
    通过basename函数返回$path中的文件名除去后缀.txt剩下的部分。
    执行该示例会产生如下结果:
    Filename: users.txt
    Filename sans extension:users

    dirname()函数它提供路径的目录部分,其形式为:
    string dirname(string path)
    下面的代码将获取到名为users.txt的文件的路径:
    <?php
    $path=”/home/www/data/users.txt”;
    printf(“Directory path: %s”,dirname($path));
    ?>
    以上代码将返回下面的结果:
    Directory path: /home/www/data
    其实也就是通过dirname函数获得了$path中的文件路径,然后通过printf函数以字符串的方式显示在%s所在的位置。

    pathinfo()函数创建了一个关联数组,其中包括路径中的三个部分,目录名,基本名和扩展名。其形式为:
    array pathinfo(string path)
    考虑如下路径:
    /home/www/htdocs/book/chapter10/index.html
    根据pathinfo(),此路径包含三个部分。
    目录名:/home/www/htdocs/book/chapter10。
    基本名:index.html。
    扩展名:html。
    <?php
    $pathinfo=pathinfo(“/home/www/htdocs/book/chapter10/index.html”);
    printf(“Dir name: %s <br/>”, $pathinfo[dirname]);
    printf(“Base name: %s<br/>”,$pathinfo[basename]);
    printf(“Extension: %s<br/>”,$pathinfo[extension]);
    ?>
    以上代码会返回:
    Dir name: /home/www/htdocs/book/chapter10
    Base name: index.html
    Extension: html
    realpath()函数将path中的所有符号链接和相对路径引用转换为相应的硬链接和绝对路径。其形式为:
    string realpath(string path)
    例如,假设目录结果为如下路径:
    /home/www/htdocs/book/images/
    可以使用realpath()来解析所有本地路径引用:
    <?php
    $imgPath=”../../images/cover.gif”;
    $absolutePath=realpath($imgPath);
    //返回的路径就是相对应的 /www/htdocs/book/images/cover.gif,其实也就是将../../中的目录结构以一种相对完整的方式呈现了出来。
    ?>
    顶
    计算文件,目录和磁盘大小在各种应用程序中都是常见的任务。其实在我们平时的学习生活中,我们并不一定要学会适应现实,有时候,我们必然要经历我们所无法预期的现实中的平凡。
    filesize()函数返回指定文件的大小,以字节为单位。其形式如下:
    int filesize(string filename)
    <?php
    $file=”/www/htdocs/book/chapter1.pdf”;
    $bytes=filesize($file);
    通过filesize函数返回$file中的chapter1.pdf的文件大小。
    $kilobytes=round($bytes/1024,2);
    $bytes/1024返回以KB为单位的文件大小,然后通过round函数保留两位小数,最后将所得的值返回给$kilobytes.
    printf(“File %s is $bytes bytes,or %.2f kilobytes”,basename($file),$kilobytes);
    通过basename函数返回文件路径$file中的文件名部分,然后通过printf函数打印出一系列的数值。
    ?>
    以上代码返回如下结果:
    File chapter1.pdf is 91815 bytes,or 89.66 kilobytes
    disk_free_space()函数返回指定的目录所在磁盘分区的可用空间(以字节为单位),其形式为:
    float disk_free_space(string directory)
    <?php
    $drive=”/usr”;
    printf(“Remaining MB on %s: %.2f”,$drive,round(disk_free_space($drive)/104576),2));
    ?>
    其实是通过disk_free_space返回$drive中所对应磁盘分区的空间大小,并以MB为单位保留两位小数,然后以字符串的格式将路径显示在%s所在的位置,将磁盘分区的空间大小以浮点数的格式显示在%.2f所在的位置。
    以上代码会返回:
    Remaining MB on /usr:2141.29
    disk_total_space()函数返回指定的目录所在磁盘分区的总容量(以字节为单位),其形式为:
    float disk_total_space(string directory)
    如果将此函数与disk_free_space()一起使用,就能很容易地给出有用的空间分配统计结果:
    <?php
    $partition=”/usr”;
    //通过disk_total_space函数以MB为单位返回$partition中的磁盘分区的总容量,并将相对应的值最终返回给$totalSpace。
    $totalSpace=disk_total_space($partition)/1048576;
    //决定已经使用的分区空间,通过将磁盘分区的总容量$totalSpace减去磁盘可用的空间容量,也就是disk_free_space函数所获得的磁盘空间可用空间容量,来最终获得相应的值返回给$usedSpace。
    $usedSpace=$totalSpace-disk_free_space($partition)/1048576;
    printf(“Partition: %s(Allocated: %.2f MB, Used:%.2f MB.)”,
    $partition,$totalSpace,$usedSpace);
    通过printf函数将磁盘分区$partition,磁盘分区的总容量$totalSpace和已经使用的分区空间$usedSpace显示在相对应的%s,%.2f,还有第三个%.2f所指定的位置。
    ?>
    以上代码会返回:
    Partition: /usr(Allocated:36716.00MB. Used: 32327.61 MB.)
    确定目录内容的大小
    <?php
    function directory_size($directory){
    $directorySize=0;
    //通过opendir函数打开目录$directory然后阅读其中的内容,@其实是错误控制操作符,附加在opendir前面是用来忽略这个函数使用之后所能够产生错误消息。
    if($dh=@opendir($directory)){
    //通过每个目录的入口进行迭代
    while((filename=readdir($dh)){
    //过滤掉一些不用的目录入口
    if($filename !=”.” && $filename !=”..”)
    {
    //决定这些文件的大小然后添加到总的文件中
    if(is_file($directory.”/”.$filename))
    通过is_file函数判断是否是一个目录中的文件
    $directorySize +=filesize($directory.”/’.$filename);
    然后通过filesize函数将目录下的所有文件的大小都累加起来,并返回给$directorySize
    //新的目录,然后初始化递归调用
    if(is_dir($directory.”/”.$filename))
    通过is_dir函数判断是否是文件目录
    $directorySize +=directory_size($directory.”/”.$filename);
    }
    }
    }
    @closedir($dh);
    return $directorySize;
    }
    #终止 directory_size()
    $directory=”/usr/book/chapter10/”;
    这里定义一个目录并返回给$directory
    $totalSize=round(directory_size($directory)/1048576),2);
    printf(“Directory %s: %f MB”,$directory: “.$totalSize”);
    ?>
    以上代码执行之后产生如下输出:
    Directory /usr/book/chapter10/: 2.12MB
    其实通过以上的这些有关于磁盘空间的函数,让我们惊喜地发现,原来,空间这种东西,看似好像是隐形的,同时也是透明的,但或许,这种隐形和透明都是可以通过我们的认真来完全忽略的。
    顶
    确定文件的最后访问和修改时间在许多管理性任务中有着非常重要的作用。其实,就跟你曾经的那些朋友是否来过你的家,提醒过你一些有关于友情的琐碎是一样的道理,你看似好像能够忽略,但是,你一直无法真正忽略得了。

    fileatime()函数返回文件的最后访问时间,采用UNIX时间戳格式,有错误时返回FALSE,其形式为:
    int fileatime(string filename)
    <?php
    $file=”/usr/local/apache2/htdocs/book/chapter10/stat.php”;
    printf(“File last accessed: %s”, date(“m-d-y g:i:sa”,fileatime($file)));
    ?>
    以上代码会返回:
    File last accessed: 06-09-03 1:26:14pm
    其中m-d-y g:i:sa的m指月份,d指一个月中的第几天,y指年份的两位数表示,g指十二小时制中的小时,不带前导零,i指分,带前导零,s指秒,带前导零,a小写形式表示,代表am或pm。然后通过date函数处理之后,以06-09-03 1:26:14pm的格式在最后显示的时候显示了出来。

    filectime()函数返回文件的最后改变时间,采用UNIX时间戳格式,有错误时返回FALSE。其形式为:
    int filectime(string filename)
    <?php
    $file=”/usr/local/apache2/htdocs/book/chapter10/stat.php”;
    printf(“File inode last changed: %s”, date(“m-d-y g:i:sa”,filectime($file)));
    ?>
    以上代码会返回:
    File inode last changed: 06-09-03 1:26:14pm
    filemtime()函数返回文件的最后修改时间,采用UNIX时间戳格式,否则返回FALSE。其形式为:
    int filemtime(string filename)
    如下代码展示了如何将最后修改时间戳放在网页上:
    <?php
    $file=”/usr/local/apache2/htdocs/book/chapter10/stat.php”;
    echo “File last updated:”.date(“m-d-y g:i:sa”, filemtime($file));
    ?>
    以上代码会返回:
    File last updated: 06-09-03 1:26:14pm
    其实通过以上这三个有关于访问和修改时间的函数,让我们自己也终于在某一个瞬间突然意识到,很多我们能够忽略的友情,同时我们不应该去忽略一些看似重要的东西,就像PHP中的很多看似有点垃圾的函数是一样的道理,我们应该通过我们自己的认真和执着来做出或者是做到一些事,如果,我们愿意开始认为我们值得去做这些事。然后,在我们的记忆碎片里,我们开始因为学过或者是掌握了这些函数而感到欣喜的同时,我们也开始慢慢地察觉得到,原来,很多时候,我们看似好像收集并整理了很多长远时间之后积淀的珍贵之物,同时,我们也终于在现在的这一个瞬间突然发现,原来,我们都是看似完整中的残缺,同时,我们也不容易真正忽略这些残缺的点或者是面。如果,我们真正愿意认真面对的话。我们原本所认为的糟粕,都会慢慢地蜕变成为精华,我们,其实都应该这样来相信,来继续坚守下去。
    顶
    程序需要一种标准的方式来识别何时到达文件的末尾,这个标准通常称为文件末尾,或EOF字符。对于EOF而言,几乎每种主流编程语言都提供了内置函数,来验证解析器是否到达了文件EOF。有时候在人生的旅途中,明明好像看似到达了自己内心中所认为的终点站,但其实,并没有真正通过自己的意志来定位到,然后,开始变得越来越疲倦,越来越烦躁,其实,这些都是能够理解,也是能够被自己的内心所接受的,也许,我们都应该适应我们定义中的那一份永恒,如果,我们开始有点固执地认为我们应该形容这种永恒的话。我们能够通过我们自己的意志到达我们内心中的终点站。如果能够做到的话,那我们就应该是看似成功的。在PHP中,此函数是feof()。feof()函数用来确定是否到达资源末尾。它在文件I/O操作中经常使用。其形式为:
    int feof(string resource)
    <?php
    打开一个文本文件用来阅读
    $fh=fopen(“/home/www/data/users.txt”,”rt”);
    rt代表只读打开一个文本文件。
    当文件末尾还没有到达的时候,读取下一行
    while(!feof($fh) echo fgets($fh);
    fgets函数从文件指针中读取一行。
    关闭文件
    fclose($fh);
    ?>
    在处理文件内容之前,通常需要创建所谓的句柄。同样,结束该资源的操作之后,应当销毁该句柄。句柄其实就相当于烧菜时候的锅,如果打开一个资源,资源特别大,可能有好几个G的文件,PHP不能操作的,因为PHP可用内存也就几十M,这样就需要一个句柄,直接指向那个资源,传递的时候只需要传递这个不到1K的句柄,就能够操作资源了。这样,其实也就是为了方便操作数据而已。

    fopen()函数将文件绑定到一个句柄,绑定之后,脚本就可以通过句柄与此文件交互,其形式为:
    resource fopen(string resource, string mode [, int use_include_path [, resource zcontext]])
    通常情况下,这个函数用来打开文件进行读取和操作。不仅如此,fopen()还能通过一些协议(包括HTTP,HTTPS和FTP)打开资源。

    考虑几个例子,第一个例子将打开一个位于本地服务器的文本文件的只读流。
    $fh=fopen(“/usr/local/apache/data/users.txt”,”rt”);
    下面的例子展示了如何打开HTML文档的写入句柄:
    $fh=fopen(“/usr/local/apache/data/docs/summary.html”,”w”);
    $fh=fopen(“summary.html”,”w”,1);
    其实其中的1指需要在include_path检索文件。如果把1改成TRUE也是可以的。其中的include_path将需要包含路径/usr/local/apache/data/docs/)。
    最后一个例子打开一个远程index.html文件的只读流:
    $fh=fopen(“http://www.example.com/”,”r”);
    当然,要记住fopen()只为即将执行的操作读取资源。它只负责建立句柄,你需要使用其他的函数来实际执行读写操作。
    确实,一旦完成资源的处理,就要撤销其指针。fclose()函数就会做此处理,关闭之前打开的由文件句柄指定的文件指针,成功时返回TRUE,否则返回FALSE。其形式为:
    boolean fclose(resource filehandle)
    filehandle必须是使用fopen()或fsockopen()打开的已存在的文件指针。
    PHP提供了很多从文件中读取数据的方法,不仅可以一次只读取一个字符,还可以一次读取整个文件。其实这跟读书是一样的道理,好像看似读了很多书,其实都只是快速阅读或者是略读,到底该如何真正地通过手中的书本实现真正意义上的阅读,其实我们最后都开始学会粗心和大意,也许,我们应该通过我们自己的思想来挖掘出我们脑海中跟这些书本,书籍有关的各个点或者是面。文件这种东西归根到底是要通过人的意识来整理,来归档的,只是,我们应该更加认真一点地去面对,去认真处理,也许,我们如果将PHP中的这些文件处理函数,这些代码认真地理解,拆分之后,我们就会在某一个瞬间惊喜地发现,原来,很多时候,我们看似好像能够忽略很多问题,但其实,这些问题一直存在于我们自己的意识深处,如果,我们愿意认为我们值得通过我们自己的努力尝试获得这些看似成功的泡影的话,那或许,我们就都是看似成功中的学习者。我们,确实需要阅读,也需要认真阅读这些跟文件相关的任何书籍。

    file()函数能够将文件读取到数组中,各元素由换行符分隔,同时换行符仍附加在每个元素的某尾,其形式为:
    array file(string filename [int use_include_path [, resource context]])
    考虑一下的文本文件,名为users.txt:
    Ale ale@example.com
    Nicole nicole@example.com
    Laura laura@example.com
    下面的脚本读取users.txt,解析数据并将其转换为方便的Web格式,注意file()很特殊,它不像其他读/写函数,你不必建立句柄来读取该函数:
    <?php
    //将users.txt这个文件读取到数组$users中去。
    $users=file(“users.txt”);
    //然后将数组反复循环
    foreach($users as $user){
    //对每一行进行分析,找到相对应的name和e-mail地址
    list($name,$email)=explode(“ ”,$user);
    通过explode函数将字符串$user分割为数组,并通过list函数赋值给将相应的name和e-mail地址。
    //从$email中删除新的行
    $email=trim($email);
    通过trim函数移除$email两侧的空白字符或其他预定义字符。
    //最后输出格式化之后的name和e-mail地址。
    echo “<a href=\”mailto:$email\”>$name</a><br/>”;
    }
    ?>
    此脚本生成如下HTML输出:
    <a href=”ale@example.com”>Ale</a><br/>
    <a href=”nicole@example.com”>Nicole</a><br/>
    <a href=”laura@example.com”>Laura</a><br/>

    file_get_contents()函数将文件中的内容读到字符串中。其形式为:
    string file_get_contents(string filename [, int use_include_path [resource context]])
    <?php
    //将文件读到字符串变量中去
    $userfile=file_get_contents(“users.txt”);
    $users=explode(“\n”,$userfile);
    将字符串$usefile通过explode函数,以\n换行作为分隔符,将最后生成的数组赋给$users。
    //将数组循环
    foreach($users as $user){
    list($name,$email)=explode(“ “,$user);
    echo “<a href=\”mailto:$email\”>$name</a><br/>”;
    }
    ?>

    fgetcsv()函数使用起来很方便,将解析标记为CSV的文件中的每一行。其形式为:
    array fgetcsv(resource handle [, int length [, string delimiter [, string enclosure>)
    考虑一下情况,每周快讯的订户数据缓存在一个文件中,供公司市场人员研究,文件可能如下所示:
    Jason Gilmore,jason@example.com,614-555-1234
    Bob Newhart,bob@example.com,510-555-9999
    Carlene Ribhurt,carlene@example.com,216-555-0987
    通过以下例子来解析缓存的文件:
    <?php
    //以只读模式打开订阅人的数据文件
    $fh=fopen(“/home/www/data/subscribers.csv”,”r”);
    //将文件的每一行打断为三个部分,并赋值给$name,$email,$phone。
    while(list($name,$email,$phone)=fgetcsv($fh,1024,”,”)){
    //将数据输出为HTML的格式
    printf(“

%s(%s)Tel. %s

”,$name,$email,$phone);
    }
    当然,file()和list()函数也能很好地完成这个工作。
    再次考虑上面的例子:
    $users=file(“/home/www/data/subscribers.csv”);
    foreach($users as $user){
    list($name,$email,$phone)=explode(“,”,$user);
    printf(“

%s (%s) Tel. %s

”,$name,$email,$phone);
    }
    ?>
    顶
    fgets()函数返回通过打开的资源句柄读入的若干个字符,或者遇到换行或EOF之前读取的所有内容。其形式为:
    string fgets(resource handle [, int length])
    其实读取字符就跟阅读书本上的那些看似繁多的每一个字是一样的道理。好像通过书本收获了很多,好像通过书店的对每一本书的推销,让很多人终于意识到,原来,很多时候,自己好像突然忽略了很多看似很有意义的书本,但其实,这些书本一直都这样很有意义,同时也非常有价值。对于我而言,复旦计算机自考本科看似好像在过去几年中一直是我的一种负担,但现在,曾经认真复习过的书本,都开始变得非常有意义在我愿意联想得到的很多个时间点和空间里,其实,我们都应该学会通过PHP,通过编程语言让我们自己收获更多,同时,我们也不仅仅只是因为编程语言的那种复杂,让学习途中的我们开始觉得我们最开始选择这一门语言的时候就是非常重要的。其实,我们应该可以想象得到,我们愿意联想的时候,我们也愿意通过我们自己的意识,让我们沉浸在我们愿意营造的幻想世界中,其实,今年的《郎朗的计算机文学》,看似好像继承了那本Web开发圣经上几乎是所有的代码,但或许,正是因为这些代码,因为那些书本上旧有的文字,让现在这一个瞬间的我终于发现,原来,我一开始选择程序员的这条路一直就很平坦,而且,我也开始通过34周岁的我来适应我的这种平坦,求学之路,一直都这样看似敞开在我的人生轨迹里,同时,也不容易轻易忘却和放弃掉,残留下的,只是你是否应该继续坚持下去,我想,我应该会继续这样坚持下去,看似好像当作兴趣爱好一样地继续坚持下去。

    <?php
    //打开users.txt的资源句柄
    $fh=fopen(“/home/www/data/users.txt”,”rt”);
    rt代表只读打开一个文本文件。其实之前已经提过fopen函数中的rt,现在再重复一遍。
    //当文件末尾没有到达的时候,通过fgets函数读取另外一行然后输出它
    while(!feof($fh)) echo fgets($fh);
    //关闭句柄
    fclose($fh);
    ?>

    fgetss()函数与fgets()相似,只是它将从输入中清除所有HTML和PHP标记。其形式为:
    string fgetss(resource handle, int length [, string allowable_tags])
    <?php
    //构建可接受的标签列表
    $tags=”

<a><img>”;
    //打开article.html,然后阅读它的内容
    $fh=fopen(“article.html”,”rt”);
    while(!feof($fh)){
    $article.=fgetss($fh,1024,$tags);
    }
    //关闭句柄
    fclose($fh);
    //以写模式打开文件,然后输出它的内容
    $fh=fopen(“article.html”,”wt”);
    fwrite($fh,$article);
    //关闭句柄
    fclose($fh);
    ?>

    fgetc()函数从由handle指定的资源流中读取一个字符。如果遇到EOF,则返回FALSE值。其形式为:
    string fgetc(resource handle)
    fread()函数从handle指定的资源中读取length个字符。当到达EOF或读取到length个字符时,读取将停止。其形式为:
    string fread(resource handle, int length)
    <?php
    $file=”/home/www/data/users.txt”;
    //打开文件用来读
    $fh=fopen($file,”rt”);
    //读整个文件
    $userdata=fread($fh,filesize($file));
    //关闭文件的句柄
    fclose($fh);
    ?>

    readfile()函数读取由filename指定的整个文件,立即输出到缓冲区,并返回读取的字节数。其形式为:
    int readfile(string filename [, int use_include_path])
    <?php
    $file=”/home/www/article/gilmore.html”;
    //将文章输出到浏览器
    $bytes=readfile($file);
    ?>

    fscanf()函数提供了一种方便的方式,可以按照预定义的格式解析资源。其形式为:
    mixed fscanf(resource handle,string format [, string var1])
    举个例子,假设希望解析如下由社会保险号(SSN)组成的文件(socsecurity.txt):
    123-45-6789
    234-56-7890
    345-67-8901
    以下例子将解析socsecurity.txt文件:
    <?php
    $fh=fopen(“socsecurity.txt”,”r”);
    以只读模式打开socsecurity.txt文件
    //然后通过fscanf函数分析每个SSN让它们符合整型-整型-整型的格式
    while($user=fscanf($fh,”%d-%d-%d”)){
    //将每个SSN的部分分配给相应的变量,$user其实是一个数组。通过list函数将数组$user中的部分分配给$part1,$part2,$part3。
    list($part1,$part2,$part3)=$user;
    printf(Part1:%d Part2:%d Part3: %d<br/>”,$part1,$part2,$part3);
    }
    fclose($fh);
    ?>
    其实,很多时候,读者的你会惊喜地发现,这本读书笔记,不单单只是因为阅读而生,其实,我们都可以成为这本书的作者,同时,我们也能够成就为这本书最好的读者。

    明天的《郎朗的计算机文学》,今天也提前更新了。复旦计算机自考本科曾经看似好像是我的负担,但现在却成为了我的一种学习和坚持的动力。这本《郎朗的计算机文学》,读书笔记,以后也会缓慢更新。该坚持的时候,就应该继续坚持下去。
    顶
    顶
    fwrite()函数将字符串的内容输出到指定的资源中,其形式为:
    int fwrite(resource handle, string string [, int length])
    如果给出可选参数length,fwrite()将在写入了length个字符时停止,否则,将一直写入,直到到达string结尾时才停止。有时候,在生活中,该放弃的时候就应该放弃,同时,也不应该一直较真在自己最不愿意同时也最不容易放弃的那一个瞬间和时间戳上,我们应该学会了解彼此,同时,我们也不容易轻易放弃彼此的心或者是灵魂,所以,我们开始学会感谢生活,但生活,也终将因为自己寿命的终结而最终形成一种怪圈,同时,我们也开始慢慢地发现,原来,我们的生活,也终将在我们最不容易忘却的时候真正地实现蜕变。其实,我们早就应该彻底想通很多事,同时,也通过我们自己对于平凡生活的理解,让我们在某一个最后的重要时间点上意识到,原来,我们彼此之间能够实现的交流,看似好像没有过多的手段,看上去好像有点过分,但或许,就是因为这种模糊跟朦胧感觉的影响之后,我们开始变得比我们没有成熟和成长前,更加的理性,同时也更加的感性。
    <?php
    //我们想写入到subscribers.txt文件内的数据
    $subscriberInfo=”Jason Gilmore|jason@example.com”;
    //打开subscribers.txt文件用来写入
    $fh=fopen(“/home/www/data/subscribers.txt”,”at”);
    其中的a表示写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。t表示打开文件的类型是文本文件。
    //写入数据
    fwrite($fh,$subscriberInfo);
    //关闭句柄
    fclose($fh);
    ?>
    fseek()函数将指针移到给定的偏移量做指定的位置。其形式为:
    int fseek(resource handle, int offset [ , int whence])
    ftell()函数获取资源中文件指针当前位置的偏移量。其形式为:
    int ftell(resource handle)
    rewind()函数将文件指针移回至资源的开头。其形式为:
    int rewind(resource handle)
    就像fopen()打开给定文件的文件指针一样,opendir()会打开路径指定的目录流。其形式为:
    resource opendir(string path)
    closedir()函数关闭目录流,其形式为:
    void closedir(resource directory_handle)
    readdir()函数返回目录中的各个元素,其形式为:
    string readdir(int directory_handle)
    此外,还可以使用此函数列出给定目录中的所有文件跟子目录:
    <?php
    $dh=opendir(“/usr/local/apache2/htdocs/”);
    通过opendir函数打开一个目录的句柄
    while($file=readdir($dh))
    通过readdir函数返回$dh目录中的各个元素用于打印输出。并赋值给$file。
    echo “$file <br/>”;
    closedir($dh);
    通过closedir关闭目录句柄。
    ?>
    以上例子输出如下:
    ..
    articles
    images
    news
    test.php
    scandir()函数是PHP5的新函数,返回一个由directory中文件和目录组成的数组,在发生错误时返回FALSE。其形式为:
    array scandir(string directory [, int sorting_order [,resource context]])
    <?php
    print_r(scandir(“/usr/local/apache2/htdocs”);
    ?>
    这会返回:
    Array([0]=>.[1]=>..[2]=>articles[3]=>images[4]=>news[5]=>test.php)
    顶
    rmdir()函数删除指定的目录,成功时返回TRUE,否则为FALSE。其形式为:
    int rmdir(string dirname)
    与PHP的许多文件系统函数一样,要想成功地删除目录,必须正确地设置权限。
    要删除一个非空的目录,可以使用一个能执行系统级命令的函数,如system()或exec(),也可以编写一个递归函数,在删除目录前先删除其中的所有文件内容。友情这种东西,看似是非常珍贵的,同时也继续保留并完整存在于你的微信好友中,但很多时候,你也会跟这些朋友有发生口角的时候,这个时候,是不是就会删除微信好友呢,也许,坏脾气其实人人都有,关键,看你到底该如何去定义,如何去权衡,所以,很多时候,在尝试告诉自己应该冷静面对自己接下去的很多事,很多看似能够忽略许久的事,但,或许,真的应该尝试遗忘,同时,还不仅仅只是因为自己能够尝试忘却很多跟朋友产生过的那些不开心的事。当看到那些删除那你微信好友的那些旧有的朋友的微信时,确实挺伤感,但,这种伤感,同时也时看似合理中的平凡。你可以选择保留自己,别人也可以选择真正地放弃你。
    <?php
    function delete_directory($dir)
    {
    if($dh=opendir($dir))
    通过opendir函数打开$dir这个目录句柄
    //通过目录的内容进行迭代
    while(($file=readdir($dh))!=false)
    {
    if(($file==”.”)||($file==”..”)) continue;
    if(is_dir($dir.’/’.$file))
    通过is_dir判断传入的路径参数是否为目录
    delete_directory($dir.’/’.$file);
    如果是目录,删除目录。
    else
    unlink($dir.’/’.$file);
    如果不是目录,通过unlink函数删除目录中所对应的文件
    }
    closedir($dh);
    rmdir($dir);
    }
    }
    $dir=”/usr/local/apache2/htdocs/book/chapter10/test/”;
    delete_directory($dir);
    ?>
    rename()函数重命名文件,成功时返回TRUE,否则返回FALSE。其形式为:
    boolean rename(string oldname, string newname)
    因为PHP脚本一般是以服务器守护进程所有者的名义来执行的。所以在用户没有文件的写入权限时rename()将失效。脱离了自己,脱离了别人的那种学习,脱离了老师教导之后的那种看似枯燥乏味的生活,很多时候确实应该尝试想要去适应,但或许,很多时候,值得忘却自己内心中真正愿意归依的方向,如果,你愿意认为你值得通过你自己的努力尝试想要去获得,去争取你自己在现实中真正愿意改变自己姓名,或者是昵称的那种努力过但却努力失败之后的话,那或许,改一个现实中的名字,看似好像不是很重要,但其实,却非常重要。

    touch()函数设置文件filename的最后修改时间和最后访问时间,成功时返回TRUE,否则为FALSE。其形式为:
    int touch(string filename [, int time [, int atime]])
    escapeshellarg()函数用单引号界定给定的参数,并为输入的参数中的单引号加上前缀(转义)。其形式为:
    string escapeshellarg(string arguments)
    escapeshellcmd()函数的工作前提与escapeshellarg()相同,通过对shell元字符转义来清理可能危险的输入。其形式为:
    string escapeshellcmd(string command)
    exec()函数最适合执行在服务器后台连续执行的操作系统级应用程序。其形式为:
    string exec(string command [, array output [, int return_var]])
    如果希望输出执行命令的结果,system()函数很有用。其形式为:
    string system(string command [, int return_var])
    passthru()函数与exec()函数相似,只不过它应当用于向调用者返回二进制输出。其形式为:
    void passthru(string command [, int return_var])
    shell_exec()函数提供了与反引号相同的语法形式,会执行一个shell命令,返回输出。其形式为:
    string shell_exec(string command)
    其实Linux操作系统中的shell命令就比如ls,cd,pwd等等。
    顶
    即使最简单的PHP应用程序也经常会涉及与日期与时间有关的一些PHP函数。无论是验证日期,以某种特定格式格式化时间戳或者将人可读的日期值转换为相应的时间戳。
    checkdate()函数能够很好地验证日期,提供的日期如果有效,则返回TRUE,否则返回FALSE。其形式为:
    Boolean checkdate(int month,int day,int year)
    考虑一个例子:
    echo “April 31,2007:”.(checkdate(4,31,2007)?’Valid’:’Invalid’);
    //checkdate这个函数会返回false,因为April四月份只有30天
    echo “<br/>”;
    echo “February 29,2004:”.(checkdate(02,29,2004)?’Valid’:’Invalid’);
    //返回真,因为2004年是一个闰年,2月份所以有29天
    echo “<br/>”;
    echo “February 29,2007:”.(checkdate(02,29,2007)?’Valid’:’Invalid’);
    //返回假,因为2007年不是一个闰年
    执行以上的例子会产生如下输出:
    April 31,2007:Invalid
    February 29,2004:Valid
    February 29,2007:Invalid
    date()函数返回根据预定义的格式指定的指令格式化的时间和(或)日期的字符串格式。其形式为:
    string date(string format [, int timestamp])
    第一个例子展示了date()最常见的用法之一,向浏览器输出一个标准日期:
    echo “Today is”.date(“F d, Y”);
    //今天是August 22,2007,其实F对应月份,d对应日期,Y对应相应的年份。
    下一个实例演示了如何输出星期几:
    echo “Today is”.date(“l”);
    //Today is Wednesday 其实l对应一个星期中具体的星期数
    再开看看当前日期更详细的表示:
    $weekday=date(“l”);
    l还是对应着一个星期中的星期数
    $daynumber=date(“dS”);
    dS对应一个月中的第几天
    $monthyear=date(“F Y”);
    F对应一年中的月份,Y对应年份
    printf(“Today is %s the %s day of %s”,$weekday,$daynumber,$monthyear);
    以上代码会输出:
    Today is Wednesday the 22nd day of August 2007
    可以直接向date()函数插入与参数无关的字符串,如下:
    echo date(“Today is l the ds day of F Y”);
    当然,还可以使用如下语法:
    echo date(“m-d-Y”);
    //04-26-2007,其实m对应月份,d对应第几天,Y对应年份。
    date()函数还可以生成与时间有关的值。
    echo “The time is”.date(“h:i:s”);
    //The time is 07:44:53 其中h对应小时,i对应分钟,s对应秒数。
    但现在是早晨还是晚上,为此只需增加a参数:
    echo “The time is”.date(“h:i:sa”);
    //The time is 07:44:53pm a对应上am还是下午pm
    gettimeofday()函数返回与当前时间有关的元素所组成的一个关联数组。其形式为:
    mixed gettimeofday([boolean return_float])
    2007年2月24日16:18:04 在测试服务器上执行gettimeofday()得到如下输出:
    Array(
    [sec]=>1172351884
    sec自UNIX纪元后的秒数
    [usec]=>321924
    usec整数秒值后面的微妙数
    [minuteswest]=>300
    minuteswest格林尼治标准时间(GMT)西部的分钟数。
    [dsttime]=>1
    dsttime。指使用日光节约时间算法。该算法在不同的地理位置有所差别。
    )
    当然,可以将输出赋给数组,然后必要时引用各个元素:
    $time=gettimeofday();
    通过gettimeofday()函数获得一天中的具体时间。
    $GMToffset=$time[‘minuteswest’]/60;
    通过$time[‘minuteswest’]获得格林尼治标准时间(GMT)西部的分钟数。除以60获得小时数。最后返回给$GMToffset
    printf(“Server location is %d hours west of GMT.”,$GMToffset);
    返回如下结果:
    Server location is 5 hours west of GMT.
    很多时候,时间这种东西,确实是因为有着边角料的时间还有充裕的时间这种区别,但其实,我们都应该清楚地意识到,很多时候,我们在开始觉得我们自己能够感谢充分利用时间给我们带来的足够好的益处的同时,我们也开始惊喜地意识到,原来,很多时候,我们开始觉得我们应该学会感谢平凡生活对于我们现实中浪费时间的那种恶意,但或许,我们早就应该彻底想通很多事,同时也真正意义上地开始感谢真正的平凡生活所能够对现实,对睡眠所耗费的那些时间所带来的影响,如果,我们愿意这样来认为,来继续认真考虑的话。时间,确实,挤一挤确实会是有的。就像我一样,每天稍微写一点,时间稍微利用一下,时间久了之后,就会有非常多的收获,如果,你愿意认为这些算是收获的话,你就会意识到时间的来之不易。
    getdate()函数接受一个时间戳,并返回一个由其各部分组成的关联数组。如果不给出UNIX格式的时间戳,则此函数返回的各个部分基于当前日期和时间。其形式为:
    array getdate([int timestamp])
    PHP提供了time()和mktime()两个函数来处理时间戳。前者用于获取当前的时间戳,后者用来获取特定的日期和时间对应的时间戳。
    time()函数用于获取当前时刻的UNIX时间戳。其形式为:
    int time()
    下面的例子在2007年8月27日15:25:00 EDT执行:
    echo time();
    这会产生相应的时间戳:
    1187897100
    使用前面介绍的date()函数,此时间戳可以转换为人类可读的日期:
    echo date(“F d,Y h:i:s”,1187897100);
    返回如下结果:
    August 7,2007 03:25:00
    其实F对应月份,d对应日期,Y对应年份,h对应小时,i对应分钟,s对应秒数。
    mktime()函数用于生成给定日期时间的时间戳,如果给出了日期和时间,则返回当前日期和时间的时间戳。其形式为:
    int mktime([int hour[, int minute [, int second [, int month [, int day [, int year [, int is_dst>>])
    例如,如果希望了解2007年2月24日4:24 p.m.的时间戳,只需输入适当的值:
    echo mktime(16,24,00,2,24,2007);
    其实16代表下午四点,24代表24分,00代表秒数,2代表两月份,24代表24日,2007代表2007年。
    这会返回如下结果:
    1172352240
    例如,现在与2008年4月15日子夜之间有多少个小时。
    $now=mktime();
    使用mktime()获取系统的当前时间。
    $taxday=mktime(0,0,0,4,15,2008);
    //在秒数上的差距
    $difference=$taxday-$now;
    //计算总的小时数
    $hours=round($difference/60/60);
    echo “Only $hours hours until tax day!”;
    这会返回如下结果:
    Only 7568 hours until tax day!
    其实时间戳到底对于现实中的我们意味着什么也许我们自己都分辨不清,也无法揣摩得透,但是,也许,我们应该通过我们现实中的某一个瞬间察觉到自己在梦境中和现实中真正的差别,我们尝试想要去遗忘一些过去曾经所无法跟他人提及的一些事,但是,为什么那种跟时间碎片有关的东西,在现实中疲惫地读过书之后的那些感受有点不一样呢,真正的原因到底在哪里,也许,我们只是为了让我们自己今后的生活变得更加安好,所以,我们利用我们现在这一个瞬间开始尝试通过亲情来抚慰我们自己,但或许我们早就应该彻底忘怀很多事,同时,通过我们自己的整理,让我们在某一个瞬间终于发现并察觉到,原来,我们一直以来都看似挺特殊,但我们一直就这样看似特殊中的平庸,同时,我们还不知疲倦地尝试想要铭记住自己身上的那些能够闪光的点,在我们愿意记忆住的时间戳里,如果,我们能够认为我们能够从这些时间跟时间的能够汇合的地方发现并意识到我们身上真正的那些闪光点的话,那我们或许就是足够成功的,也是足够失败的。
    顶
    顶
    setlocale()函数通过赋新值来改变PHP的默认本地化环境。其形式为:
    string setlocale(mixed category, string locale[, string locale...])
    string setlocale(mixed category, array locale)
    strftime()函数根据setlocale()指定的本地化设置来格式化日期和时间。其形式为:
    string strftime(string format[, int timestamp])
    虽然它的格式与date()相同,能接受一些转换参数来确定所请求日期和时间的布局,但很遗憾,这些参数与date()使用的参数不同。
    通过使用strftime()和setlocal(),可以根据用户的本地语言,标准和习惯来格式化日期。
    为旅游网站的用户提供本地化的旅行时期和票价就很简单:
    Benvenuto abordo,Sr.Sanzi<br/>
    <?php
    setlocale(LC_ALL,”it_IT”);
    $tickets=2;
    $departure_time=1118837700;
    $return_time=1119457800;
    $cost=1350.99;
    ?>
    Numero di biglietti:<?php echo $tickets; ?><br/>
    Orario di partenza:<?php echo strftime(“%d %B,%Y”,$departure_time); ?><br/>
    Orario di ritorno: <?php echo strftime(“%d %B,%Y”,$return_time); ?><br/>
    Prezzo incluso: <?php echo money_format(‘%i’,$cost); ?><br/>
    以上代码返回如下结果:
    Benvenuto abordo,Sr.Sanzi
    Numero di biglietti:2
    Orario di partenza:15 giugno,2007
    Orario di ritorno:22 giugno,2007
    Prezzo IVA incluso: EUR 1.350,99
    其实代码中的%d代表月份中的数值日期,有前导的0,也就是代表具体的日期中的几号,%B代表完整的月份名,%Y代表数值年份,有世纪号。其实通过money_format函数将$cost中的货币格式转化为en_US国际格式,i 代表数字被格式化为国际货币格式。EUR代表欧元。

    当需要更新时间戳的时候,可以使用date()和getlastmod()自动完成这项任务。getlastmod()函数返回该页面的Last-Modified首部,遇到错误则返回FALSE。其形式为:
    int getlastmod()
    如果与date()一起使用,就能很容易地提供关于页面最后修改时间和日期的信息:
    $lastmod=date(“F d,Y h:i:sa”,getlastmod());
    echo “Page last modified on $lastmod”;
    以上代码会返回:
    Page last modified on February 26,2007 07:59:34pm
    为确定当前月份中的天数,可以使用date()的t参数。考虑如下代码:
    printf(“There are %d days in %s.”,date(“t”),date(“F”));
    如果在4月执行,则输出如下结果:
    There are 30 days in April.
    有时可能希望确定某个月份的天数,而不是当前月份,只用date()函数无法实现这一要求,因为它需要一个时间戳,而现在只有年份和月份,但是,mktime()函数可以用来生成所需的结果。假设希望确定2007年2月的天数:
    $lastday=mktime(0,0,0,3,0,2007);
    printf(“There are %d days in February 2007.”,date(“t”,$lastday));
    执行这段代码得到如下结果:
    There are 28 days in February 2007.
    其实在写今天这个教程的时候,不知不觉中我好像已经在钱桥单独支撑,靠文字坚持了两年多。跟母亲今天差一点就吵了起来,也许,被人误解是一种看似非常常有的事,记录在自己内心中所定义出的那一段时间戳里。也许,坚持一两年不算是什么,但如果能够坚持二三十年的话,那会不会就意味着很多时候,我们在开始想要做出一点成绩的时候,我们必然也无法真正遗忘我们所能够给对方和彼此所能够带来的感动,其实,我们早就应该彻底释怀我们内心中真正想要渴望的那些东西,坚持这一件事,看似并不是非常重要,但或许,应该存在于我们自己的意识深处,如果,我们愿意认为我们值得付出我们的时间来彻底整理出一些东西的话,那或许,我们就必然在某一个最为特定的时间点有所收获。
    顶
    确定未来或过去几天的确切日期通常是有用的。使用strtotime()函数和GNU日期语法,就能很容易地满足这种需求,假设希望知道在今天(2007年2月25日)未来45天后的日期:
    $futuredate=strtotime(“45 days”);
    echo date(“F d, Y”,$futuredate);
    这会返回:
    April 12,2007
    F代表月份,d代表具体的几号,Y代表年份。
    前面加上一个负号,就可以确定45天前的日期(今天是2007年2月25日):
    $pastdate=strtotime(“-45 days”);
    echo date(“F d, Y”,$pastdate);
    返回如下结果:
    January 11,2007
    其实从2007年2月25日到2007年1月11日之间相隔45天。所以最后显示的日期是2007年1月11日。
    今天(2007年2月25日)后10周加2天呢?
    $futuredate=strtotime(“10 weeks 2 days”);
    echo date(“F d ,Y”,$futuredate);
    这会返回:
    May 9,2007
    PHP5.1中对PHP日期和时间的支持有所改进,不仅增加了一个面向对象接口,还能够相应于各个时区管理日期和时间。其实在现实中如果很多时候阅读编程的书籍感到烦躁,不安的时候。有时候我会时不时地看一下手机上的时间,看着那个时钟中的秒针慢慢地逝去,慢慢地在走,确实,时间这种东西是不可逆的,同时,也正因为这个原因,整个现实中的世界,跟自己所幻想中的世界,本来就有着非常大的区别,同时这种区别还能够在现实中变得越来越明显,越来越生动。其实,我们可以通过我们自己对于时间的掌控和控制来真正驾驭好时间,我们不仅仅只是因为我们自己对于某种爱好的确定和确认之后,让现在的我们终于在现在这一个时间戳终于意识到,原来,我们一直以来都能够做好我们自己,而不单单只是我们愿意认为我们值得通过我们对于时间的花费来真正让身旁的那些看上去浪费时间的人有所触动,如果,这种对于时间的珍惜,真正能够触动并触及到看似入局中的自己,还有看似旁观中的那些旁观者的话。

    使用Date特性之前,需要通过其类构造函数实例化一个日期对象,这个构造函数的形式如下:
    object DateTime([string $time [, DateTimeZone $timezone]])
    Date()方法就是类构造函数。可以在实例化时设置日期,也可以使用各个修改方法(设置方法)来设置。要创建一个空的日期对象(这会将日期对象设置为当前日期),只需如下调用
    DateTime():
    $date=new DateTime();
    要创建一个日期对象,并设置日期为2007年2月27日,可以执行以下代码:
    $date=new Date(“27 February 2007”);
    你也可以设置时间,比如设置为9:55p.m,如下:
    $date=new Date(“27 February 2007 21:55”);
    或许只需如下设置时间:
    $date=new Date(“21:55”);
    顶
    要格式化日期和时间进行输出,或者想轻松地获取日期中的某个部分,可以使用format()方法。这个方法与date()函数的参数相同。例如,要使用2007-02-2709:55:00pm格式输出日期和时间,可以如下调用format():
    echo $date->format(“Y-m-d h:i:sa”);
    一旦实例化DateTime对象,可以使用setDate()方法设置其日期。setDate()方法会设置日期对象的日,月和年,如果成功返回TRUE,否则返回FALSE。其形式如下:
    Boolean setDate(integer year,integer month,integer day)
    下面将日期设置为2007年2月27日:
    $date=new DateTime();
    $date->setDate(2007,2,27);
    echo $date->format(“F j, Y”);
    以上代码会返回如下输出:
    February 27,2007
    其实F对应的是月份,j对应具体的日期,Y对应的是年份。
    DateTime实例化后可以设置日期,与此类似,还可以使用setTime()方法设置时间。setTime()方法将设置日期对象的小时和分钟,还可以设置秒(可选),如果成功返回TRUE,否则返回FALSE。其形式如下:
    Boolean setTime(integer hour,integer minute [, integer second])
    下面将时间设置为8:55 p.m.:
    $date=new DateTime();
    $date->setTime(20,55);
    其实20对应的就是晚上八点。
    echo $date->format(“h:i:s”);
    以上代码会返回以下输出:
    08:55:00
    H对应小时,i对应分钟,s对应具体的秒。
    可以使用modify()方法修改DateTime对象。与构造函数类似,这个方法采用了同样的对用户友好的语法。例如,假设创建了一个DateTime对象,包含值February 28. 2007 00:33:00。
    现在希望把这个日期向后调7个小时。改为February 28. 20077:33:00:
    $date=new DateTime(“February 28, 2007 00:33”);
    $date->modify(“+7 hours”);
    echo $date->format(“Y-m-d h:i:s”);
    以上代码会返回以下结果:
    2007-02-28 07:33:00

    不知不觉中,PHP中有关于日期和时间的部分就这样到此为止了。其实,我们在求学的路上,本来就都是因为期待未知,所以我们才会渴求我们内心中跟未知有关的已知,我们应该非常清楚的一点就是,其实,对于编程有着浓厚兴趣的我们而言,我们一直以来都应该认识到时间的重要性。在我们最为艰苦的高中时期我们就应该意识到我们应该清晰地通过紧张的学习来洞悉我们今后的,看似轻松其实更为艰苦的大学生活,我们真正应该珍惜并珍视的大学时光。我们早就应该想通的那些事,其实,我们应该通过我们自己对于时间的重视,让我们意识到,原来,我们一直以来的任务,就是好好学习,掌握好我们所认为的那些技能和技术,PHP也不过就是一种编程的手段,代码在你的手中,关键在于你怎么去用好和学好它们。其实,我跟你们一样,是求学路上的,还在继续耕耘和努力奋斗的那种人,也许,我们都是一样的,即便,我们是看似不同中的相同。也许,通过代码的学习,好像无法真正收获很多,但,也同样通过认真地敲打代码,让我们终于发现并意识到,原来,那个看似在潜意识里对于代码有点抵触的我们而言,其实,已经真正意义上地在潜意识里被代码所感染了,这,或许就是PHP的真正魅力。
    顶
    我们对Web感兴趣,认为它有用的原因是其主要通过基于HTML的表单发布和收集信息的能力。这些表单用来鼓励网站的反馈,进行论坛会话,收集在线订购的邮件地址,等等。但是对HTML表单进行编码只是有效接受用户输入的必需操作的一部分,必需由服务器端组件来处理输入。从一个脚本向另一个脚本传递数据时,可使用两种常见的方法:GET和POST。虽然GET是默认方法,但一般希望使用POST,因为它能处理更多的数据,使用表单插入和修改大块文本时,能处理更多数据很重要。如果使用POST,所有发送给PHP脚本的提交数据都必须使用$_POST语法来引用。例如,假设表单包含一个文本字段值email,如下:
    <input type=”text” id=”email” name=”email” size=”20” maxlength=”40”/>
    提交表单后,就可以如下引用这个文本域值:
    $_POST[‘email’]
    当然,出于方便考虑,完全可以先把这个值赋给另一个变量,如下:
    $email=$_POST[‘email’];
    但是根据最佳实践(即永远都不能假设用户输入是安全的),还应当通过某个能够实现数据安全性检查的函数(如htmlentities())对用户提供的数据进行过滤,如下所示:
    $email=htmlentities($_POST[‘email’]);
    如果用户提交的数据随后会发布到一个网站(如一个Web论坛),字符串中的某些字符可能会恶意地修改一个HTML页面,而htmlentities()函数的作用就是转换这些字符串。
    其实表单这种东西,最为常用的就是在网站中填写用户注册信息的时候,那个填写的页面就是一个具体的表单的内容,就比如姓名,性别,年龄等等。有时候你会很厌烦这种东西,但其实这种东西本来就很常用,同时也很固定。人生中随处可见的,已经打印好的单子其实也是一种表单在现实中的具体化的方式,当我们开始习惯于适应这些东西的时候,我们开始让我们自己变得不再抽象,而变得更加具体。也许,我们早就应该认真地总结我们在现实中无法避免地去修改表单的一些事,当然,我们早就应该彻底想通并想明白我们的以后。除了古怪的命名约定外,$_POST变量与任何其他变量一样。采用这种方式引用只是为了明确地划分外部变量是从哪里来的。这种约定可以用于来自GET方法,cookie,会话,服务器和上传文件的变量。PHP不仅对于处理表单数据特别有效,对于具体创建表单本身也很有意义。我们可以尝试修改我们人生中的表单,如果我们还是固执地认为现实中我们无法彻底改变的那些固定化的表单之类的东西,在能够改变我们自己的人生轨迹的时候,这些表单之类的东西,开始变得越来越珍贵,也越来越明朗化起来。
    顶
    以下脚本生成一个表单,提示用户输入姓名和电子邮件地址。完成并提交后,脚本(名为subscribe.php)会把此信息显示在浏览器窗口中。
    <?php
    if(isset($_POST[‘name’]))
    通过isset函数判断变量$_POST[‘name’]是否已经设置而且非空
    {
    $name=htmlentities($_POST[‘name’]);
    $email=htmlentities($_POST[‘’email’]);
    通过htmlentities函数将$_POST[‘name’]和$_POST[‘email’]转换为html实体。
    printf(“Hi %s!<br/>”,$name);
    printf(“The address %s will soon be a spam-magnet!<br/>”,$email);
    }
    通过printf函数将$name和$email打印显示在%s所在的位置。
    ?>
    <form action=”subscribe.php” method=”post”>
    


    Name:<br/>
    <input type=”text” id=”name” name=”name” size=”20” maxlength=”40” />
    


    


    Email Address:<br/>
    <input type=”text” id=”email” name=”email” size=”20”maxlength=”40”/>
    


    <input type=”submit” id=”submit” name=”submit” value=”Go!”/>
    </form>
    假设用户填写完两个域,单击了Go!按钮,输出内容将如下所示:
    Hi Bill!
    The address bill@example.com will soon be a spam-magnet!
    向函数传递表单数据的过程与传递其他变量的过程是一样的。只要将提交的表单数据作为函数参数传递即可。
    <?php
    //用来验证e-mail的函数
    function validateEmail($email)
    {
    //创建e-mail验证的正则表达式
    $regexp=”^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,6})$”;
    其实这个正则表达式中的[_a-z0-9-]代表所有小写英文字母还有下划线和减号。其实大家已经发现这个正则表达式看似好像有点复杂,其实也是有规律可以摸索的。^还是代表以什么什么开头,$还是代表以什么什么结尾。\.代表英文的句号。[a-z]{2,6}代表有2个到6个英文字母。其实,搞来搞去也就是如何拆分,如何通过理解部分的正则表达式来理解这个复杂的正则表达式。我们可以让我们自己适应这种看似有点枯燥乏味的学习生活,当然,我们可以尝试学会适应,当然,我们必然也会在我们能够通过理解我们自己还有我们所能够想象得到的那个世界中的我们的时候,让现在这一个瞬间的我们终于发现,我们人生中的正则表达式,看似复杂,其实也透过这种复杂,让我们之后的人生之路,变得开始有点崎岖的同时,也附带着很多的伤感,但是,也伴随着非常强大的正能量,让我们有勇气,有能力继续走下去,继续学习下去。如果,我们还是愿意这样努力去坚持,去认真地尝试做好一些事的话。

    //通过ereg函数在$email中搜索$regexp所指定的模式的字符串。
    if(eregi($regexp,$email)) return 1;
    else return 0;
    }
    if(isset($_POST[‘submit’]))
    通过isset函数判断$_POST[‘submit’]是否已经设置而且非空。
    {
    $name=htmlentities($_POST[‘name’]);
    $email=htmlentities($_POST[‘email’]);
    printf(“Hi %s<br/>”,$name);
    if(validateEmail($email))
    printf(“The address %s is valid!”,$email);
    else
    printf(“The address <strong>%s</strong> is invalid!”,$email);
    }
    ?>
    <form action=”subscribe.php”method=”post”>
    


    Name:<br/>
    <input type=”text” id=”name” name=”name” size=”20” maxlength=”40”/>
    通过指定input type=”text”设定表单的文本框组件,将id设定为name,name属性也设定为name,文本框大小设定为20,最大长度maxlength设定为40。
    


    


    E-mail Address:<br/>
    <input type=”text” id=”email” name=”email” size=”20” maxlength=”40” />
    


    <input type=”submit” id=”submit” name=”submit” value=”Go!” />
    其中的value也就是submit提交按钮上的文字是Go!
    </form>
    很多时候,在我们人生中的表单上填写好属于我们自己专属的答卷,也是一种手段,同时也是一种证明自己的最好的方式。如果,我们愿意真正表现出我们自己最好一面的话。
    排版显示有问题还是因为分段标签p在起作用,但是不影响阅读代码。
    顶
    多值表单组件(如复选框和多选框),大大提高了基于Web的数据收集能力,因为这些组件允许用户为一个指定的表单项同时选择多个值。例如,考虑一个表单,它能用来判断用户对计算机的哪些方面感兴趣。特别地,它可以用来询问用户感兴趣的编程语言,通过使用文本字段和多选框。就比如如下的代码。其实,多值表单组件只是一种表现的方式和手段,在PHP里面,其实如果跟Jquery这个框架结合使用的话,你会通过这个JavaScript框架跟PHP,HTML的结合使用,实现一个非常不错的,在界面上非常美观,同时在性能上又非常简易的表单之类的页面,其实,我们开始学会让我们自己从框架中收获一些属于这些框架的东西,但,或许,我们早就应该彻底释放我们内心中的渴望,让我们自己通过我们自己的努力尝试让我们变得更加成熟,同时也更加知性一点,如果,我们开始愿意认为我们值得托付我们的人生在PHP上的话,那或许,我们就必然能够收获很多。

    <select name=”languages[]” multiple=”multiple”>
    设定多选框的名称为languages[],相当于一个数组,设定多选框的类型为multiple。
    <option value=”csharp”>C#</option>
    <option value=”jscript”>JavaScript</option>
    <option value=”perl”>Perl</option>
    <option value=”php”>PHP</option>
    设定四个可以选择的选项。
    </select>
    下面继续考虑一个完整的例子。
    <?php
    if(isset($_POST[‘submit’])){
    通过isset函数判断$_POST[‘submit’]的值是否已经设置而且非空。
    echo “You like the following languages:<br/>”;
    foreach($_POST[‘languages’] AS $language){
    通过foreach函数对数组languages中的语言进行遍历操作
    $language=htmlentities($language);
    echo “$language<br/>”;
    }
    }
    ?>
    <form action=”multiplevaluesexample.php” method=”post”>
    指定该表单提交到multiplevaluesexample.php这个php文件,表单的提交方式是post。
    What’s your favorite programming language?<br/>(check all that apply):<br/>
    <input type=”checkbox” name=”languages[]” value=”csharp”/>C#<br/>
    之所以设定type为checkbox,其实是因为这需要用下拉选项来显示这些编程语言的选项。有时候,看似有点乏味,看似有点单调,但,或许,通过这些看似有点枯燥乏味的代码的学习,你很多时候会发现自己突然好像聪明了一点点,但,就是因为这种通过时间的累积和积聚之后,在你必将收获的时间点和时间戳上,你就会慢慢通过现实中的总结和提炼发现你身上最为闪耀的发光处和闪光点。如果,你认为你人生中的下拉框不是很明显,或者不是很明朗化,那是因为你开始有时候会质疑你自己真正的能力。其实,只是因为选项看似太多太多,但,这些选项,在很多方面,很多层次上都能够说明并证明很多问题。真正残留下的,只是自己到底是否应该继续认真阅读编程代码,做一个真正地在虔诚地编写和阅读代码的人,而不是一种变相地继续追求自己内心中真正渴望的那些东西。
    <input type=”checkbox” name=”languages[]” value=”jscript”/>JavaScript<br/>
    <input type=”checkbox” name=”languages[]” value=”perl”/>Perl<br/>
    <input type=”checkbox” name=”languages[]” value=”php”/>PHP<br/>
    <input type=”submit” name=”submit” value=”Submit!”/>
    </form>
    如果用户选择语言C#和PHP,他将得到如下欢迎词:
    You like the following languages:
    csharp
    php
    顶
    顶
    为了力图自动地实现表单的创建,验证和处理过程。让人耳目一新的HTML_QuickForm包就提供了这样一个解决方案。这个包可以通过PEAR库得到。
    HTML_QuickForm不仅仅是一个简单的表单生成类,它还提供了20余个XHTML兼容表单元素,可以完成客户端和服务器端验证,能够集成模板引擎,如Smarty,还提供了一个可扩展的模型,允许创建你自己的定制元素,以及许多的特性。有时候你会惊喜地发现其实自己不应该仅仅只是尝试想要适应自己内心中的孤独,也许,只是因为尝试因为这个世界,尝试因为PHP的支持和帮助之后,让我们终于发现,也许,我们应该定义出属于我们的那一份完美,如果,我们愿意认为我们值得通过我们自己的努力,尝试想要化解现实中看似枯燥乏味的生活之余的那些东西,当然,我们应该彻底释怀我们现实中对于我们人生中最完美表单的那一份奢望和期待,如果,我们能够想象得到我们现实中真正愿意定位得到的那些完美的话,那我们就能够实现我们人生中真正愿意兑现得到的那些现实感。

    使用HTML_QuickForm创建表单简直是小菜一碟,只需实例化HTML_QuickForm类。然后根据需要调用addElement()方法,传入元素类型和属性来创建各个表单组件。最后,调用display()方法来显示表单。如下代码用HTML_QuickForm来创建表单。
    <?php
    require_once “HTML/QuickForm.php”;
    //创建一个languages数组用来作为表单的多选下拉框
    $languages=array(
    ‘C#’=>’C#’,
    ‘JavaScript’=>’JavaScript’,
    ‘Perl’=>’Perl’,
    ‘PHP’=>’PHP’
    );
    //实例化HTML_QuickForm类
    $form=new HTML_QuickForm(“languages”);
    //添加文本输入元素用来输入username用户名
    $form->addElement(‘text’,’username’,’Your name:’,array(‘size’=>20,’maxlength’=>40));
    //添加文本输入元素用来输入e-mail地址
    $form->addElement(‘text’,’email’,’E-mail address:’,array(‘size’=>20,’maxlength’=>50));
    //添加下拉框元素用来选择你可能最喜欢的编程语言,也就是languages数组中所列举的那些编程语言。
    $select=&$form->addElement(‘select’,’languages’,’Your favorite<br/>programming languages:’,$languages);
    //将这些多选的属性赋值给下拉框
    $select->setMultiple(1);
    //添加提交按钮
    $form->addElement(‘submit’,null,’Submit!’);
    //显示表单
    $form->display();
    ?>
    HTML_QuickForm提供了一种方法,可以通过一个过滤器传递数据,这样就能对数据完成你所希望的任何分析。这些过滤器实际上就是函数,可以使用PHP的任何内置函数,也可以创建你自己的函数作为过滤器。可以如下设置过滤器:
    $form->applyFilter(“employeeid’,’strtoupper’);
    当然,当你希望明确地限制用户,不能插入某种形式的数据,而且在满足某些约束条件之前不允许处理表单。所以,必须标志出错误,通知用户存在问题,这就引入了规则。
    常用的预定义验证规则:
    规则 描述 用法
    alphanumeric 值只能包含字母和数字
    callback 值必须通过用户自定义函数传递 函数名
    compare 值与另一个字段值比较 eq,neq,gt,gte,lt,lte
    email 值必须是一个合法的电子邮件地址 布尔值(是否用checkdnsrr()完成域验证)
    lettersonly 值只能包含字母
    maxlength 值不能超过N个字符 整数值
    minlength 值必须等于或多于N个字符 整数值
    nopunctuation 值不能包含标点符号
    nonzero 值不能以0开头
    numeric 值必须是一个数字
    rangelength 值的字符数不许介于最小数和最大数之间 array(min,max)
    regex 值必须正确地通过正则表达式验证 正则表达式
    required 必须有值
    举个例子,要定义一个规则,要求用户输入一个ZIP编码,可以使用以下规则:
    $form->addRule(‘zipcode’,Please enter a zipcode’,’required’,null,’client’);
    其实对于现实中的我们而言,我们其实早就应该学会说服我们自己相信,我们的人生也是有规则的,也是有规律的,当然,我们其实期待我们现实中真正愿意实现并兑现完美的那一个瞬间或者是时刻,我们只是因为学会了懂得了解,学会了懂得感谢,所以,我们开始变得越来越成熟的同时也附带着感性和知性,我们应该通过现实中的我们自己,彻底想通并释怀很多事,如果,我们愿意珍惜我们现在的这些时间,遵守我们现实中所必须遵循的规则的话。

    下面的例子展示了required规则的使用,要求完成客户端验证,这里使用一个警告窗口显示一个错误消息(HTML_QuickForm的默认行为),或者,如果顺利地通过了规则,则显示一个欢迎消息:
    <?php
    require_once “HTML/QuickForm.php”;
    //实例化HTML_QuickForm类
    $form=new HTML_QuickForm(“login”);
    //添加文本输入元素用来输入username
    $form->addElement(‘text’,’username’,’Your name:’,array(‘size’=>20,’maxlength’=>40));
    //添加文本输入元素用来输入e-mail地址
    $form->addElement(‘text’,’email’,’E-mail address’,array(‘size’=>20,’maxlength’=>50));
    //添加一个规则,也就是需要username的规则。
    $form->addRule(‘username’,’Please provide your username.’,’required’,null,’client’);
    //添加submit按钮
    $form->addElement(‘submit’,null,’Submit!’);
    if($form->validate()){
    echo “Welcome to the restricted site,”.htmlspecialchars($form->exportValue(‘username’)).”.”;
    }
    //显示form表单
    $form->display();
    ?>
    一旦提交了表单,肯定希望能有一种简便的方法来获取表单值。有3个方法可以使用:
    getSubmitValues(),process()和exportvalue()。
    getSubmitValues()方法以数组形式返回所提交的值,如下例所示:
    if($form->validate()){
    print_r($form->getSubmitValues());
    }
    这会生成如下输出:
    Array([username]=>jason [email]=>wj@example.com)
    process()方法将值传入一个函数。例如,假设创建了一个函数(名为retrieveBook())与Amazon的Web服务通信。可以将用户数据如下传入这个函数:
    if($form->validate()){
    $form->process(‘retrieveBook’);
    }
    最后,exportvalue()函数通过指定域名可以有选择地获取各个值,例如,假设希望获取一个username表单域指定的用户名值:
    if($form->validate()){
    $username=$form->exportvalue(‘username’);
    }
    HTML_QuickForm提供了丰富的特性,除了表单创建,验证和处理特性外,HTML_QuickForm还提供了一些高级功能,其中一个特性就是自动完成特性。
    <?php
    require “HTML/QuickForm.php”;
    //创建一个数组用来实现自动完成的功能
    $teams=array(‘Steelers’,’Seahawks’,’Steel Curtains’);
    //实例化HTML_QuickForm类
    $form=new HTML_QuickForm();
    //创建自动完成autocomplete元素
    $element=&$form->addElement(‘autocomplete’,’teams’,’Favorite Football Team:’);
    //将数组映射到autocomplete域
    $element->setOptions($teams);
    //显示这个表单
    $form->display();
    ?>
    Web最强大的功能不应该仅仅只是发布信息,我们通过网站实现了我们现实中很难实现的很多理想,同时,我们不仅仅只是因为尝试想要通过Web的方式来实现自己的理想,也许,我们应该想通我们现实中的很多事,当然,我们应该认真总结现实中的我们自己,如果,我们愿意认为我们值得付出我们的时间来处理我们人生中这些看似复杂的表单群的话。你能够适应一个人的群体,你也能够适应你所谓的,你能够认为的代码中的,属于你自己的那一份骄傲和自豪感。
    这样一来,这本PHP开发圣经这本书前13章分析完毕,做成了读书笔记。应该对大家很有帮助吧。
    顶
    验证用户身份是当今Web应用程序常见的操作。不仅是出于安全原因,还要根据用户的首选项和类型来提供网站定制的功能。通常,网络会提示用户输入用户名和密码,它们组合成为用户的唯一标识。我们可以在现实中有着我们自己愿意组合或者是排列的一种我们所独有的认证方式,当然,我们不仅仅只是因为习惯于我们所能够认为的认证,在我们不愿意透露我们真实档案和真实信息的时候,我们开始学会感谢我们现实中曾经真正存在过的那些人和那些事,所以,我们开始变得越来越成熟,同时也越来越真实起来。其实,成熟跟不成熟,本来就无须过多讨论,同时也无须过多计较。我们,应该需要这样的一种认证的方式来呈现出最真实的我们自己。

    HTTP协议提供了一种非常简单,但很有效的用户验证方式。典型的验证过程如下所示:
    (1) 客户请求一个受限的资源
    (2) 服务器用一个401(未授权访问)响应消息对这个请求做出响应。
    (3) 客户端(浏览器)识别401响应,弹出一个验证提示窗口。大多数现代浏览器都能够理解HTTP验证,并提供了适当的功能,包括IE,Netscape Navigator,Mozilla和Opera。
    (4) 用户提供的凭证(用户名和密码)发回给服务器进行验证。如果用户提供了正确的凭证,则允许访问,否则访问被拒绝。
    (5) 如果用户得到了验证,浏览器将在其验证缓存中存储验证信息。此缓存消息将一直保存在浏览器,直到缓存被清空,或浏览器收到另一个401服务器响应。
    PHP使用两个预定义的变量来验证用户:$_SERVER[‘PHP_AUTH_USER’] 和$_SERVER[‘PHP_AUTH_PW’]。这些变量分别保存了用户名和密码。
    通过PHP处理验证时常用到两个标准函数:header()和isset()。
    header()函数向浏览器发送原始的HTTP首部。string参数指定发送给浏览器的首部信息。其形式为:
    void header(string string [, boolean replace [, int http_response_code]])
    <?php
    header(‘WWW-Authenticate: Basic Realm=”Book Projects”);
    header(“HTTP/1.1 401 Unauthorized”;
    ?>
    isset()函数确定是否已为一个变量赋值。其形式为:
    boolean isset(mixed var [, mixed var[,..]])
    如下代码使用了isset()验证变量是否包含值。
    <?php
    //如果用户名和密码没有设置,则显示授权窗口
    if(!isset($_SERVER[‘PHP_AUTH_USER’]||!isset($_SERVER[‘PHP_AUTH_PW’])){
    header(‘WWW-Authenticate: Basic Realm=”Authentication”’);
    header(“HTTP/1.1 401 Unauthorized”);
    //如果用户名和密码已经设置了,则输出他们的认证信息
    }else{
    echo “Your supplied username:”.$_SERVER[‘PHP_AUTH_USER’].”<br/>”;
    echo “Your password:”.$_SERVER[‘PHP_AUTH_PW’].”<br/>”;
    }
    ?>
    其实验证用户名和密码在javascript中也有,而且还非常详细地通过javascript的代码来表现和呈现出来,也许,我们应该通过我们自己对于用户验证和密码验证的理解来定义出我们自己内心中PHP知识体系的真正理解,当我们在学习的途中感到烦躁不安的时候,我们可以用我们内心中的一种认可来衡量好我们自己的以后,也许,我们仅仅只是因为我们应该学会理解,学会感受的同时让我们自己在未来的日子里能够收获更多,同时也能够成长更多。也许,我们在我们愿意感受得到我们内心中真正鼓励的时候能够在脑海中浮现出我们内心中真正愿意渴望的方向和彼岸,当我们能够真正面对的时候,我们必然也无法真正忘却的同时,在我们愿意考虑我们今后,能够通过我们内心中那一份真正认证的话。
    顶
    要限制对资源的访问,最简单的方法是直接在脚本中硬编码用户名和密码。其实有点类似于强制通过其他人的方式来影响现实中的你的很多的判断和言行。当然,我们其实应该欣喜地发现,原来,我们人生中的硬编码也可以同样因为编程语言的原因,特别是PHP,变得更加复杂的同时,也包含着一定的神秘感。看似复杂,看似有点强制,但这种复杂,这种强制,很多时候都是需要我们自己通过我们自己的意识去梳理,去整理出来的。大家说是吧。如下代码就是按照硬编码登陆对进行身份验证:
    if(($_SERVER[‘PHP_AUTH_USER’])!=’specialuser’)||(($_SERVER[‘PHP_AUTH_PW’])!=’secretpassword’){
    header(‘WWW-Authenticate:Basic Realm=”Secret Stash”’);
    header(‘HTTP/1.0 401 Unauthorized’);
    print(‘You must provide the proper credentials!’);
    exit;
    }
    以上例子中的逻辑非常简单,如果$_SERVER[‘PHP_AUTH_USER’]和$_SERVER[‘PHP_AUTH_PW’]分别设置为specialuser和secretpassword,该代码块将不会执行,而执行之后的代码,否则,用户将得到提示,要求输入用户名和密码,直到提供了正确的信息,或者在多次验证失败后显示一个401未授权消息。
    虽然使用硬编码验证对非常快捷,易于配置,但这种方法存在一些缺点,首先,对于当前的代码,所有需要访问此资源的用户都必须使用相同的验证对。在实际中,通常每个用户都必须唯一标识,这样才会有用户特定的首选项或资源。虽然可以通过增加额外的逻辑允许有多个登录对,但这样的代码将非常麻烦,很难处理。其次,修改用户名和密码只能在代码中进行,并且只能手工调整。以下代码提供了这样一个文件,其中每行包含一个用户名和加密密码对,用户名和密码之间用冒号(:)分隔。
    jason:60d99e58d66a5e0f4f89ec3ddd1d9a80
    donald:d5fc4b0e45c8f9a333c0056492c191cf
    mickey:bc180dbc583491c00f8a1cd134f7517b
    要解析以上的这个文件并根据给定的登录对来验证用户,为此所需的PHP脚本只比根据硬编码验证对完成验证所用的脚本稍微复杂一点。区别在于此脚本必须将文本文件读取到数组中,然后循环处理数组,搜索匹配的数据。这需要使用一些函数。具体如下所示:
    file(string filename)。file()函数将文件读取到数组中,数组的每个元素分别包括文件中的一行。
    explode(string separator,string string[, int limit])。explode()函数将字符串分解为一系列子字符串,每个字符串的边界由指定的分隔符决定。
    md5(string str)。md5()函数使用RSA数据安全公司的MD5消息摘要算法来计算字符串的MD5散列值。
    以下代码能够解析上面的这个加密的文件。并将用户输入与登陆对相匹配。
    <?php
    //将认证状态预调为false
    $authorized=FALSE;
    if(isset($_SERVER[‘PHP_AUTH_USER’])&&isset($_SERVER[‘PHP_AUTH_PW’])){
    //将认证文件读入一个数组中
    $authFile=file(“/usr/local/lib/php/site/authenticate.txt”);
    //从数组中搜索认证的相关匹配
    //如果使用Windows系统,则使用\r\n
    if(in_array($_SERVER[‘PHP_AUTH_USER’].”:”.md5($_SERVER[‘PHP_AUTH_PW’].”\n”,$authFile))
    $authorized=TRUE;
    }
    //如果没有授权,则显示认证提示或者401错误
    if(!$authorized){
    header(‘WWW-Authenticate:Basic Realm=”Secret Stash”’);
    header(‘HTTP/1.0 401 Unauthorized’);
    print(‘You must provide the proper credentials!’);
    exit;
    }
    //受限的材料从这里开始
    ?>
    其实有时候你会发现,看似很简单的一个加密文件,竟然要用以上这么多的代码来进行处理,最终实现验证,当然,我们其实应该想清楚和想明白的一点就是,我们那些平凡无奇的姓名和我们自己所设定的那些看似隐秘的密码,都开始能够解释现实中我们是唯一的这一种非常独特的定义,其实,我们都应该学会适应我们所无法表现出的那一种独特感和优越感,如果,我们能够认为我们值得花费我们宝贵的时间来敲打这些有关于验证的代码。其实,我个人感觉这是绝对值得的,至少在认真地尝试去做好一件事。
    顶
    在之前讨论的各种验证方法中,实现基于数据库的解决方案是功能最强大的一种方法,因为它不仅改善了管理的方便性,提高了可扩展性,而且可以集成到更大的数据库基础设施中,出于方便理解的目的,这里将数据库限制为只有三个字段(主键,用户名和密码)。主键大家可以理解为是一种唯一的标识和象征,通过主键,可以定义出这个数据库表中最唯一,最具有代表性的字段。字段数也就能够代表这个数据库表中到底有几列数据。这些列放在名为logins的表中,以下代码就是一个用户验证表。
    CREATE TABLE logins(
    创建一个数据库表logins
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    设置一个字段id unsigned非负 not null非空 auto_increment自增,也就是自动增加1.
    username VARCHAR(16) NOT NULL,
    设置一个字段username varchar字符串类型 not null非空
    pswd VARCHAR(32) NOT NULL,
    设置一个字段pswd varchar字符串类型 not null非空
    PRIMARY KEY(id));
    设置id字段为这个数据库表中的唯一标识,也就是主键
    接下来是几行示例数据:
    id username password
    1 wjgilmore 098f6bcd4621d373cade4e832627b4f6
    2 mwade 0e4ab1a5a6d8390f09e9a0f2d45aeb7f
    3 jgennick 3c05ce06d51e9498ea472691cd811fb6
    可以看到数据库中的id确实是在每插入一行数据之后自动增加1,大家就能够理解到auto_increment自增的实际意义了。
    以下代码可用户按照存储在logins表中存储的数据来验证由用户提供的用户名和密码。
    <?php
    //因为认证提示需要被触发两次,所以将它植入一个函数内。
    function authenticate_user(){
    header(‘WWW-Authenticate: Basic realm=”Secret Stash”’);
    header(“HTTP/1.0 401 Unauthorized”);
    exit;
    }
    //如果$_SERVER[‘PHP_AUTH_USER’]内容是空白的,这个用户就还未被认证信息提示过。
    if(!isset($_SERVER[‘PHP_AUTH_USER’])){
    /*通过isset函数判断$_SERVER[‘PHP_AUTH_USER’]是否已经设置,如果没有设置好的话,则跳转到authenticate_user()函数。*/
    authenticate_user();
    }else{
    //连接到MySQL数据库
    mysql_pconnect(“localhost”,”authenticator”,”secret”)
    //通过mysql_pconnect进行localhost本地数据库连接,用户名为authenticator,密码为secret
    or die(“Can’t connect to database server!”);
    mysql_select_db(“corporate”)
    //通过mysql_select_db选择数据库corporate
    or die(“Can’t select database!”);
    //创建然后执行select查询语句
    $query=”SELECT username,pswd FROM userauth WHERE username=’$_SERVER[PHP_AUTH_USER]’ AND pswd=MD5(‘$_SERVER[PHP_AUTH_PW]’)”;
    $result=mysql_query($query);
    //通过mysql_query查询函数查询$query中的SELECT语句,并返回给$result
    //如果没有发现任何东西,那就重新提示用户登录的相关信息
    if(mysql_num_rows($result)==0){
    如果$result通过mysql_num_rows函数查询之后,发现查询的结果集中没有任何行的数据。则跳转到authenticate_user()函数。
    authenticate_user();
    }else
    {
    echo “Welcome to the secret archive!”;
    }
    }
    ?>
    大家可以明显发现MySQL验证比前两种验证方法功能更强大,实际上实现起来却相当简单。只要对logins表执行一个选择查询,使用所输入的用户名和密码作为查询条件即可。当然,这种解决方案并非只能使用MySQL数据库,任何关系数据库都可以。其实,数据库是最为万能的,同时也是最容易理解的一种创建数据表的手段。我们大脑中储存的信息其实都可以理解为是数据库,我们可以通过我们自己的理解方式,通过SELECT查询语句查询中我们大脑中所储存的那些字段,那些相关的行和列。数据库是我们现实中所抽象出来的一种储存大量数据的手段,如果,我们开始非常欣喜地发现原来我们的大脑里面可以容纳这么多行的数据,同时,我们大脑的潜能只是仅仅激发了一小部分,由此可见,我们,确实应该更加深刻地去理解好我们自己,同时也充分发挥出我们自己的能动性去做好任何事,特别是写好代码。
    顶
    有时需要更高级别的访问限制来确定用户的合法性。为解决这个问题,进一步确保验证的正确性,一种有效的方法是不仅需要合法的用户名/密码登陆对,还需要一个特定的IP地址。其实,并不是因为现实中那些看似有点复杂的点或者是面之类的影响,在学习PHP代码的过程中,我们本来就已经开始习惯于通过阅读代码的注释来真正理解代码的真正含义。但很多时候,我们开始觉得太过于枯燥,所以,我才觉得适当地在代码之余加一点东西或者是点缀一点东西是必要的,同时也是必然的。用户名和密码的方式在很多网站的注册页面都是常见的,当然,其实,你在填写用户注册的信息时本来就已经是通过javascript的方式来进行验证了,所以,并不是因为我们不习惯使用我们本地的IP地址,localhost也就是127.0.0.1其实也就是你这台电脑的本机IP地址。在下面的代码中出现的数据库服务器连接时候的localhost就是这样的含义。其实,看似很简单的东西,在复杂了一小段,一小部分之后,我们其实还是容易理解,同时也不容易遗忘,特别是通过敲打代码的方式。为此,需要对之前代码中的logins表稍作修改。修改后的logins表和PHP代码如下:
    CREATE TABLE logins(
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    pswd VARCHAR(32) NOT NULL,
    ip VARCHAR(15) NOT NULL,
    PRIMARY KEY(id));
    <?php
    function authenticate_user(){
    header(‘WWW-Authenticate: Basic realm=”Secret Stash”’);
    header(“HTTP/1.0 401 Unauthorized”);
    exit;
    }
    if(!isset($_SERVER[‘PHP_AUTH_USER’])){
    通过isset函数判断$_SERVER[‘PHP_AUTH_USER’]是否已经设置,如果没有设置,则执行authenticate_user()函数。
    authenticate_user();
    }else{
    mysql_connect(“localhost”,”authenticator”,”secret”)
    通过mysql_connect函数连接到本地的mysql服务器localhost,服务器用户名authenticator,密码secret,如果连接不成功,则提示不能够连接到数据库服务器。
    or die(“Can’t connect to database server!”);
    mysql_select_db(“corporate”)
    通过mysql_select_db函数连接到数据服务器中的corporate表中。如果失败,则提示不能够连接到之前想要验证的数据库。
    or die(“Can’t select authentication database!”);
    $query=”SELECT username,pswd FROM logins WHERE username=’$_SERVER[PHP_AUTH_USER]’
    AND pswd=MD5(‘$_SERVER[PHP_AUTH_PW]’) AND ip=’$_SERVER[REMOTE_ADDR]’”;
    通过SELECT语句从数据库logins表中选择相对应的username用户名和密码pswd。当然,username要等于$_SERVER[PHP_AUTH_USER],pswd要等于通过MD5加密函数处理之后的$_SERVER[PHP_AUTH_PW],然后ip等于$_SERVER[REMOTE_ADDR]。
    $result=mysql_query($query);
    通过mysql_query函数对$query中的mysql语句进行处理,返回结果给$result
    if(mysql_num_rows($result)==0)
    如果通过mysql_num_rows函数获取的$result中的结果集的行数一行都没有。其实说得更简单一点,没有查询到任何一行的相关数据的话,则执行之后的authenticate_user()函数。
    authenticate_user();
    else
    否则的话就打印欢迎来到密码档案。
    echo “Wecome to the secret archive!”;
    mysql_close();
    }# end if
    ?>
    虽然这层额外的安全很管用,但要知道这也并非万无一失。IP欺骗(即欺骗网络使其认为数据是从某个特定IP地址发出的)一直都是专业攻击者惯用的工具之一。因此,如果攻击者获得了用户的用户名和密码,就可以绕过基于IP的安全设施。其实,我们应该已经通过以上的这些代码终于在某一个瞬间意识到,原来,我们可以变得这样单纯在我们不愿意阅读太久的PHP代码上,当然,其实,我们能够想到的点和面也开始因为我们对于PHP更深入一层次的研究过后,让我们终于察觉到,原来,我们看似被PHP欺负过,而不是欺骗过,但这种欺负,其实是善意的,而且是有着一定帮助作用的善意。
    顶
    顶
    其实之前讨论的验证方法非常完善,但把一些实现细节隐藏在类中会更好。隐藏在自己所无法预知的细节中其实也是一种功力,通过自己的理解方式来理解PHP代码,或者是通过自己的理解方式来更加深入地了解认证和授权的一些相关的概念。其实,我们应该能够体会得到其实我们的内心深处,一直在渴望一些什么,同时,我们也不容易真正忘却一些什么。PHP留给我们的很多看似扩展了很多的在思维领域的拓展之后,我们开始惊喜地发现,原来,我们的意识深处,其实是不排斥一些看似新颖的东西,同时我们也不容易真正放下一些看似固定不变的东西,如果,我们能够察觉得到,同时,我们也不容易真正忘却的同时寻觅得到我们内心中编程的真正动力,特别是在我们学习PHP相关的新的东西的时候。PEAR类Auth_HTTP就能很好地满足此需要。Auth_HTTP封装了用户验证的很多杂乱方面,通过方便的接口提供了我们所需要的信息和特性。以下的代码就是使用Auth_HTTP验证用户凭证。
    <?php
    require_once(“Auth/HTTP.php”);
    //指定认证的资格,表名,用户名username和password字段,密码的加密类型,还有查询query参数用来作为找回其他的相关信息。
    $dblogin=array(
    ‘dsn’=>”mysql:://corpweb:secret@localhost/corporate”,
    ‘table’=>”login”,
    ‘usernamecol’=>”username”,
    ‘passwordcol’=>”pswd”,
    ‘cryptType’=>”md5”,
    ‘db_fields’=>”*”
    );
    //实例化Auth_HTTP
    $auth=new Auth_HTTP(“DB”,$dblogin) or die(“Can’t connect!”);
    //开始认证的过程
    $auth->start();
    //万一认证失败该提供的一些相关信息
    $auth->setCancelText(‘Authentication credentials not accepted!’);
    //检查一些相关的资格,如果没有找到,就做出一些提示
    if($auth->getAuth())
    echo “Welcome,$auth->commonname<br/>”;
    ?>
    执行以上的这些代码,并传递在userauth表中找到的匹配信息,将允许用户进入受限区域。否则,将收到由setCancelText()中提供的错误信息。之前代码中的$dblogin数组要传递到Auth_HTTP构造函数,并声明为一个数据源类型。这个数组的第一个元素dsn表示数据源名(DSN)。DSN必须以如下格式表示:
    datasource:username:password@hostname/database
    因此,使用如下DSN登陆MySQL数据库:
    mysql://corpweb:secret@localhost/corporate
    接下来三个元素是table,usernamecol和passwordcol,分别表示存储验证信息的表,存储用户名名的列名和存储密码的列名。
    cryptType元素指定密码是按明文还是MD5散列存储在数据库中。如果以明文存储,cryptType应当为none,如果存储为MD5散列,则应当设置为md5。
    最后,db_fields元素提供用于获取任何其他表信息(如commonname字段)的查询参数。
    其实,我们应该能够意识到,也许,我们在内心深处确实是有点排斥PHP的这种方式的拓展或者说是扩展,但其实,正是因为有了这些扩展和拓展的帮助之后,方便我们更加深入地去理解PHP的一些看似有些隐秘的东西,所以,我们应该能够收获更多,同时我们也通过我们自己的积累总结并提炼得到很多看似更加深奥的东西。如果,我们还是愿意继续这样学习并坚持下去的话。我相信大家会继续学习并坚持下去的。
    顶
    为了尽可能减少在系统中引入易猜测的密码,方法很简单,只要将创建无异议密码的过程变为自动密码的批准过程即可。PHP通过CrackLib库为此提供了绝好的机会。以下的代码就是一个完整的使用例子。
    <?php
    $pswd=”567hejk39”;
    //打开密码字典,同时标注密码字典的文件名并不包括相应的扩展。/usr/lib/cracklib_dict是在linux系统下的一个文件目录,其实usr是Unix Software Resource的缩写,也就是Unix操作系统软件资源所放置的目录,而不是用户的数据。我其实刚开始的时候也以为/usr是Linux下用户的相关目录,但是通过学习,通过了解之后才发现自己的这个误区其实很多Linux系统的初学者都会有,误区其实并不算是什么,最关键的是到底该如何正视这种误区。
    $dictionary=crack_opendict(‘/usr/lib/cracklib_dict’);
    //检查密码的可猜测性
    $check=crack_check($dictionary,$pswd);
    //找回结果
    echo crack_getlastmessage();
    //关闭密码字典
    crack_closedict($dictionary);
    ?>
    有时候需要一种简单的自动机制,当用户忘记密码时,可以获取或重置他或她的密码。根据登录所保护内容的敏感度,可能需要通过电话获取密码,或通过邮政服务来发送密码。设计这种机制时,始终要考虑可能会受到入侵者的攻击,这种机制就是一次性URL。在没有其他验证机制时,或者当用户认为验证对于当前的任务过于烦琐时,一次性URL常用于向用户确保唯一性。就比如提供一个指向新闻的一次性URL,如下:
    http://www.example.com/newsletter/0503.php?id=9b758e7f08a2165d664c2684fddbcde2
    为了确切地知道哪些用户对新闻主题感兴趣,要为每位用户分配一个类似于前面URL中的唯一ID,存储在某个订阅者表中。这些值一般是伪随机值,可使用PHP的md5()和uniqid()函数生成,如下:
    $id=md5(uniqid(rand(),1));
    subscribers订阅者表与下表类似:
    CREATE TABLE subscribers(
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    email VARCHAR(55) NOT NULL,
    hash VARCHAR(32) NOT NULL,
    read CHAR,
    PRIMARY KEY(id));
    当用户单击此链接时,就会查看这个新闻,并在显示新闻之前执行类似于下面的函数:
    $query=”UPDATE subscribers SET read=’Y’ WHERE hash=’$id’”;
    mysql_query($query);
    这样一来,你就知道到底有多少订阅者对此新闻感兴趣,因为他们单击了这个链接。
    以下代码是一次性URL生成程序:
    <?php
    //创建唯一的标识
    $id=md5(uniqid(rand(),1));
    //用户的email邮件地址
    $address=$_POST[email];
    //设置用户的hash field哈希域为一个唯一的id
    $query=”UPDATE logins SET hash=’$id’ WHERE email=’$address’”;
    $result=mysql_query($query);
    $email=<<<email
    Dear user,
    Click on the following link to reset your password:
    http://www.example.com/users/lostpassword.php?id=$id
    email;
    //邮件用户密码的重置选项
    mail($address,”Password recovery”,”$email”,”FROM:services@example.com”);
    echo “

Instructions regarding resetting your password have been sent to
    $address

”;
    ?>
    如下代码是重新设置用户的密码:
    <?php
    //创建一个伪随机密码,长度为5个字符
    $pswd=substr(md5(uniqid(rand())),5);
    //用户的哈希值
    $id=$_GET[id];
    //用新的密码更新用户的表
    $query=”UPDATE logins SET pswd=’$pswd’ WHERE hash=’$id’”;
    $result=mysql_query($query);
    //显示新的密码
    echo “

Your password has been reset to $pswd.

”;
    ?>
    其实,谈了这么多,你有时候会发现其实现实中恢复密码是一件看似非常麻烦的事,通过什么手机短信发送和认证啦,还有什么通过邮件的方式来找回之类的事,其实,我们其实应该意识到我们自己内心深处其实是渴望用一种最为简单和真挚的方式来对待我们一直都视若为珍宝的,属于我们自己那一段密码段。当然,其实,我相信我们其实是能够改变这一小段看似微小,但却是非常珍贵的一段东西。不仅仅是通过URL来恢复密码。其实有很多的手段,关键是看你如何正视这种手段。
    顶
    顶
    在HTML中需要增加一些特性来支持文件上传,其实文件上传就好像在读书的时候总需要一个过渡期,或者是一段磨合期,磨合期满了之后,文件上传完毕了,就实现了一定的功能,或者是通过这个上传之后的表单,提交了一部分信息和数据上去。当然,我们其实通过这个磨合期我们能够想到并联想得到很多东西,其实,我们开始学会适应我们现实中对于自己的那一份最为本真的定位时,我们开始能够学会懂得梳理我们现实中能够整理并总结的很多东西。如果,我们总是有一种固执,认为我们现实中的诸多努力都是看似正确的,同时也是看似模糊的。我们在看似清晰并模糊中印刻着我们内心深处一直所渴望的那种看似有点类似于磨合期的那种虚假感,但其实,这种虚假感一直都显得非常奇怪,同时也非常生僻,但是,这种奇怪,这种生僻,一直以来,我们都应该能够通过我们自己的意识去控制,去驾驭好。如果,我们能够通过我们自己的努力尝试做到许多的话,那或许,残留给我们的,就不单单只是感动,而是热泪盈眶了吧。
    文件上传表单的代码示例如下。
    <form action=”uploadmanager.html” enctype=”multipart/form-data” method=”post”>
    Name:<br/><input type=”text” name=”name” value=”” /><br/>
    Email:<br/><input type=”text” name=”email” value=””/><br/>
    Class notes:<br/><input type=”file” name=”homework” value=””/><br/>
    

<input type=”submit” name=”submit” value=”Submit Homework”/>


    </form>
    其实,上传文件接收和后续的处理是上传处理函数的功能,当然,上传处理函数通过使用
    某个服务器进程创建,或者利用强大的服务器端语言如Perl,Java或PHP等创建。如下介绍一些PHP的文件上传/资源指令。这些指令都是在PHP配置文件php.ini中的。大家如果从网上下载了WAMP这个PHP服务器的傻瓜包的话,肯定能够看到php.ini这个配置文件的,里面有很多有用的指令可以供你来调节PHP服务器的相关配置和设置。
    1.file_uploads=On/off
    作用域:PHP_INI_SYSTEM:默认值:1
    file_uploads指令确定服务器上的PHP脚本是否可以接受文件上传。
    2.max_execution_time=integer
    作用域:PHP_INI_ALL:默认值:30
    max_execution_time指令确定PHP脚本在注册一个致命错误之前可以执行的最长时间,以秒为单位。
    3.memory_limit=integer M
    作用域:PHP_INI_ALL:默认值:8M
    memory_limit指令设置脚本可以分配的最大内存量,以MB为单位。此指令只有在编译时设置了--enable-memory-limit标志的情况下才生效。
    4.upload_max_filesize=integer M
    作用域:PHP_INI_SYSTEM:默认值:2M
    upload_max_filesize指令确定上传文件的最大大小。以MB为单位。此指令必须小于post_max_size。
    5.upload_tmp_dir=string
    作用域:PHP_INI_SYSTEM:默认值:Null。
    上传的文件在处理之前必须成功地传输到服务器,所以必须指定一个位置,可以临时放置这些文件,直到文件移到最终目的地为止。这个位置使用upload_tmp_dir指令来指定。假设希望将上传的文件临时路径存储在/tmp/phpuploads/目录,就要使用:
    upload_tmp_dir=”/tmp/phpuploads/”
    当然,务必牢记,这个目录对于拥有此服务器进程的用户必须是可写的。
    6.post_max_size=integer M
    作用域:PHP_INI_SYSYEM:默认值:8M
    post_max_size指令确定通过POST方法可以接受的信息的最大大小,以MB为单位。通常情况下,此指令设置应当大于upload_max_filesize。
    值班编辑我今天七点半更新的内容删除了干嘛,没什么问题的啊,不要再删除了,没意思的。
    顶
    $_FILES超级全局变量和特殊,它是预定义EGCPFS(Environment,Get,Cookie,Put,Files,Server)超级全局数组中唯一的二维数组。其作用是存储各种与上传文件有关的信息。
    1.$_FILES[‘userfile’][‘error’]数组值提供了与上传尝试结果有关的重要信息。总共有5个不同的返回值,其中一个表示成功的结果,另外4个表示在尝试中出现的特定错误。
    2.$_FILES[‘userfile’][‘name’]变量指定客户端机器上声明的文件最初的名字,包括扩展名。如果浏览一个名为vacation.jpg的文件,并通过表单上传,则此变量的值将是vacation.png。
    3.$_FILES[‘userfile’][‘size’]变量指定从客户端上传的文件的大小,以字节为单位。
    4.$_FILES[‘userfile’][‘tmp_name’]变量指定上传到服务器后为文件赋予的临时名。这是存储在临时目录(由PHP指令upload_tmp_dir指定)中时所指定的文件名。
    5.$_FILES[‘userfile’][‘type’]变量指定从客户端上传的文件的MIME类型。因此,在vacation.jpg文件的例子中,此变量会赋值为image/jpeg。如果上传的是PDF,则赋值为application/pdf。
    其实很多时候人总有一种错觉,到底为什么会产生出一些非常特殊的,类似于上面的这些超级全局变量呢,也许,通过我们的大脑其实已经能够存储非常巨大的信息量,作用跟这些二维数组是一样的。只是,我们应该要充分利用好我们自己的大脑去处理这些信息,同时,在我们想要用的时候去用好这些信息,也许,我们会感觉我们疲劳的时候我们在思考很多东西的时候会变得异常辛苦,但其实,这种辛苦,确实是看似徒劳无功的,同时也是非常有作用的。毕竟,我们通过文字的方式在纸张上书写就是一种对于大脑内存储信息的灵活运用,我们只是缺乏了一种表现自己最好方式的手段,所以,我们开始学会感谢现实中的生活时,我们必然也无法真正遗忘的一点就是,其实,我们都是能够做好很多事,同时,我们也不容易真正忘怀很多事。其实,记忆住一个瞬间不是很难,关键在于如何灵活运用自己头脑中存储的信息量去尽善尽美地做好很多看似很枯燥乏味的事。如果,我们开始愿意通过我们自己曾经的积累去感谢生活,感谢上苍的话。我们总是希望我们自己充分利用好我们现实中看似有点不够用的时间,但其实,我们早就已经彻底通过我们现实中的积累来做好很多个步骤,通过这些步骤,我们开始惊喜地发现,原来,我们一直不仅仅只是一个人,不仅仅只是一个人在努力做事,在努力学习。

    is_uploaded_file()函数确定由输入参数filename指定的文件是否使用POST方法上传。其形式为:boolean is_uploaded_file(string filename)
    <?php
    if(is_uploaded_file($_FILES[‘classnotes’][‘tmp_name’])){
    //通过is_uploaded_file()检查$_FILES[‘classnotes’][‘tmp_name’]指定的文件是否确实是上传文件。如果答案是肯定的,就将此文件复制到所要求的目标。否则,执行else语句之后的代码,显示适当的错误信息。
    copy($_FILES[‘classnotes’][‘tmp_name’],
    “/www/htdocs/classnotes/”.$_FILES[‘classnotes’][‘name’]);
    }else{
    echo “

Potential script abuse attempt detected.

”;
    }
    ?>
    move_uploaded_file()函数这是将上传文件从临时目录移动到最终目标的一个便利方法。
    boolean move_uploaded_file(string filename,string destination)
    如果希望将课程笔记文件上传到目录/www/htdocs/classnotes/中,同时保留客户端指定的文件名:
    move_uploaded_file($_FILES[‘classnotes’][‘tmp_name’],”/www/htdocs/classnotes/”.$_FILES[‘classnotes’][‘name’]);
    顶
    如何知道文件上传过程是否成功,如果在上传的过程中出现了错误,如何知道是什么导致了错误。幸运的是,有足够的信息可以确定成果,并在出现错误的情况下找到出错原因,很多时候,人在困惑的时候往往无法找到自己在现实中,通过PHP代码找寻得到的,自己的最为真实的定位。但其实,这种定位本来就是看似特殊中的不特殊,也许,我们通过我们自己清醒的意识,已经意识到我们不仅仅只是因为需要某一种寄托自己情感中的真正的发泄方式。但是,我们又不得不去承认的一点就是,我们在我们愿意留恋的地方不断徘徊。当我们想要给这个现实世界传达出一些信息的时候,我们往往是无力的,我们通过我们自己的无能无力看似做到了很多。但其实我们已经失去了很多。在得到与失去之间,我们权衡我们现实之中利弊的方式变得看似越来越不真实。但其实,就是因为这种真实与虚假之间的最明显的区别,让现实中的我们终于发现,我们也可以同样变得很理智的同时不容易轻易放弃我们的很多种的想法。其实,我们早就应该学会彻底释怀很多事。当然,我们也不容易真正遗忘我们现实中一度不愿意提交,不愿意跟其他人分享的那些看似无法上传的信息。这些信息由$_FILES[‘userfile’][‘error’]提供。

    (1) UPLOAD_ERR_OK,如果上传成功返回0。
    (2) UPLOAD_ERR_INI_SIZE,如果试图上传的文件大小超出了upload_max_filesize指令指定的值,则返回1。
    (3) UPLOAD_ERR_FORM_SIZE,如果试图上传的文件大小超出了MAX_FILE_SIZE指令(可能嵌入在HTML表单中)指定的值,则返回2。
    (4) UPLOAD_ERR_PARTIAL,如果文件没有完全上传,则返回3。如果出现网络错误,导致上传过程中断,就可能发生这种情况。
    (5) UPLOAD_ERR_NO_FILE,如果用户没有指定上传的文件就提交表单,则返回4。
    如下代码就是一个简单的文件上传示例。
    <form action=”uploadmanager.php” enctype=”multipart/form-data” method=”post”>
    //设置这个表单的信息填写好之后提交到uploadmanager.php,表单的提交方式是post,post传送的数据量相比较get的方式较大,post传送的数据量一般被默认为不受限制。get是从服务器上获取数据,post是向服务器传送数据。enctype就是编码类型的意思。multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据。
    Last Name:<br/><input type=”text” name=”name” value=”” /><br/>
    //input type=”text”创建了一个可允许输入同时用户无需滚动即可查看15个字符的空白文本控件。name是表单提交后,给后台处理程序进行处理的表单元素名。value属性为input元素的设定值。在这里是文本控件上默认的值。后面的input type=”file”用于文件上传。还有input type=”submit”这样的按钮用户点击之后会自动提交掉表单,除非你写了javascript阻止它。
    Class Notes:<br/><input type=”file” name=”classnotes” value=””/><br/>
    

<input type=”submit” name=”submit” value=”Submit Notes”/>


    </form>
    <?php
    /*设置一个常量*/
    define(“FILEREPOSITORY”,”/home/www/htdocs/class/classnotes/”);
    /*确认这个文件已经通过post的方式传送了。*/
    if(is_uploaded_file($_FILES[‘classnotes’][‘tmp_name’])){
    /*判断这个文件是否是一个PDF文件?*/
    if($_FILES[‘classnotes’][‘type’]!=”application/pdf”){
    echo “

Class notes must be uploaded in PDF format.

”;
    }else{
    /*移动已经上传的文件到最终的目的地。*/
    $name=$_POST[‘name’];
    $result=move_uploaded_file($_FILES[‘classnotes’][‘tmp_name’],
    FILEREPOSITORY,”/$name.pdf”);
    if($result==1) echo”

File successfully uploaded.

”;
    else echo “

There was a problem uploading the file.

”;
    }#endIF
    }#endIF
    ?>
    顶
    类HTTP_Upload通过使用一个类来隐藏实际操作细节。它封装了上传的许多杂乱方面,通过一个便利的接口提供了我们需要的信息和特性。有时候,在我们无法意识得到的现实中,我们一度无法相信我们很多种的想法和构思其实都能够融合到一个点或者是一件具体化的事物上,我们总是应该学会通过自己的意识来控制和驾驭一件事,但其实,这种事情,看似有点不够简单,但或许,通过这种不简单和不纯粹,很多看似复杂的事情其实用一分为二的方法就能够拆分出一定的作用,通过这种连带的作用,很多时候能够在现实中的复杂工作中起到非常至关重要的作用。我们只是应该通过我们自己的意识去控制一些事,但或许,这些事从头至尾就应该是看似错误中的正确。所以,我们开始学会掩饰,开始学会伪装,封装掉我们现实中一度感觉有点棘手的那些重复劳动。PHP写代码其实从根本上来讲也是一种重复劳动,而且这种重复能够停留很久的同时也不容易真正放弃在自己愿意放弃的现实里。我们,开始学会懂得通过我们自己的清醒意识,真正察觉到自己在现实中看似有点琐碎的真实定位。我们,确实时常需要提醒和警醒自己。用HTTP_Upload上传文件非常简单,只需调用类构造函数,并把文件相应表单域的名传递到getFiles()方法。如果上传正确(可以使用isValid()方法检验),可以将文件移动到其最终目标位置(使用moveTo()方法)。如下代码就是使用HTTP_Upload移动一个上传的文件。
    <?php
    require(‘HTTP/Upload.php’);
    //创建一个新的HTTP_Upload对象
    $upload=new HTTP_Upload();
    //找回这个classnote文件
    $file=$upload->getFiles(‘classnotes’);
    //如果上传的文件没有产生任何问题
    if($file->isValid()){
    $file->moveTo(‘/home/httpdPEAR/html/uploads’);
    echo “File successfully uploaded!”;
    }
    else{
    echo $file->errorMsg();
    }
    ?>
    可以看到最后一行调用了一个名为errorMsg()的方法。这个包可以跟踪多种可能出现的错误,包括上传目录不存在,没有写权限,复制失败或文件超过最大上传大小限制等有关问题。默认情况下,会用英语显示这些消息,要改变显示错误的默认语言,可以使用相应语言的适当缩写调用HTTP_Upload()构造函数。例如,要改为西班牙语(es),可以如下调用构造函数:
    $upload=new HTTP_Upload(‘es’);
    如下代码使用HTTP_Upload获取文件属性。
    <?php
    require(‘HTTP/Upload.php’);
    //创建一个新的HTTP_Upload对象
    $upload=new HTTP_Upload();
    //找回相对应的classnotes文件
    $file=$upload->getFile(‘classnotes’);
    //将文件的属性加载到关联数组中去
    $props=$file->getProp();
    //输出相对应的属性
    print_r($props);
    ?>
    上传名为notes.txt的文件。执行以上代码,得到如下输出:
    Array(
    [real]=>notes.txt
    [name]=>note.txt
    [form_name]=>classnotes
    [ext]=>txt
    [tmp_name]=>/tmp/B723k_ka43
    [size]=>22616
    [type]=>text/plain
    [error]=>
    )
    如果你需要获取一个属性的值,就将键传递给getProp()调用。例如,假设希望知道文件的大小(以字节为单位):
    echo $files->getProp(‘size’);
    会生成如下输出:
    22616
    HTTP_Upload的亮点之一是能够管理多个文件上传,为处理包含多个文件的表单,所要做的只是调用该类的新实例,对每个上传控制调用getFiles()。
    <form action=”multiplehomework.php” enctype=”multipart/form-data” method=”post”>
    Last Name:<br/><input type=”text” name=”name” value=””/><br/>
    Homework #1<br/><input type=”file” name=”homework1” value=””/><br/>
    Homework #2<br/><input type=”file” name=”homework2” value=””/><br/>
    Homework #3<br/><input type=”file” name=”homework3” value=””/><br/>
    Homework #4<br/><input type=”file” name=”homework4” value=””/><br/>
    Homework #5<br/><input type=”file” name=”homework5” value=””/><br/>
    

<input type=”submit” name=”submit” value=”Submit Notes”/>


    </form>
    使用HTTP_Upload进行处理非常简单:
    $homework=new HTTP_Upload();
    $hw1=$homework->getFiles(‘homework1’);
    $hw2=$homework->getFiles(‘homework2’);
    $hw3=$homework->getFiles(‘homework3’);
    $hw4=$homework->getFiles(‘homework4’);
    $hw5=$homework->getFiles(‘homework5’);
    至此,只用isValid()和moveTo()等方法就完全可以处理这些文件了。
    顶
    当今,要调查或排除网络问题,通常需要收集各种影响客户端,服务器和网络内部构件的信息,如协议,域名解析和IP地址模式等。PHP提供了很多函数来获取各个方面的信息。DNS允许使用域名来代替对用户不那么友好的相应IP地址,例如192.0.34.166。域名及其相应的IP地址存储在域名服务器上可供引用,这些域名服务器分布在世界各地。其实在我计算机自考本科的时候我曾经考过计算机网络原理这门课程有三次,那个时候对于很多的网络协议还不是非常熟悉,但是,通过背诵的方式其实确实记忆住了很多的计算机网络原理中的一些看上去非常难以理解的概念,就比如三次握手协议还有开放系统互联参考模型0SI中的网络七层协议。在最开始理解的时候曾经有过很多误区,同时,也通过这些误区让我自己终于清醒地发现并意识到其实阅读计算机的自考本科书籍很多时候对于自己曾经的程序员工作也是一种总结和提高,也许,在适应了自己内心中的那一份枯燥之后,很多值得通过自己的认真和努力尝试总结并提炼出的东西,一直都显得非常奇怪,非常难以通过自己的理解方式去分析,去判断。也许,这并不仅仅只是因为自己尝试想要在计算机自考本科的这个过程中通过计算机网络原理总结得到很多看似无法通过其他方式总结的东西,不仅仅只是因为计算机理论的那种在精神上的足够支撑。只是因为自己尝试想要去熟悉一些看似不熟悉的东西,也许,只是因为尝试想要遗忘,但是,却一直无法真正忘却那些在现实中,一度在熟悉上徘徊的,但是在自己的记忆点中,不断地盘旋同时也不容易通过自己的意识去驾驭和控制的那种无力感。
    checkdnsrr()函数检查是否存在DNS记录。其形式为:
    int checkdnsrr(string host [, string type])
    如果找到记录,则返回TRUE,否则返回FALSE。
    假设希望验证是否域名example.com有一个相应的DNS记录:
    <?php
    $recordexists=checkdnsrr(“example.com”,”ANY”);
    //通过checkdnsrr函数,以ANY查找example.com中任意类型的DNS记录
    if($recordexists) echo “The domain name has been reserved.Sorry!”;
    //如果DNS记录查找成功,则打印该域名已经被使用了。非常抱歉。
    else echo “The domain name is available!”;
    //否则打印该域名还是可以使用的。
    ?>
    以上代码返回如下:
    The domain name has been reserved.Sorry!
    可以使用这个函数验证给定邮件地址的域是否存在:
    <?php
    $email=”ceo@example.com”;
    $domain=explode(“@”,$email);
    //通过explode函数将$email中的域名字符串通过@作为分隔符打散为数组。
    $valid=checkdnsrr($domain[1],”ANY”);
    //通过checkdnsrr函数以ANY查找$domain[1],其实也就是$email中的@之后的example.com中任意类型的DNS记录。
    if($valid) echo “The domain exist!”;
    else echo”Cannot locate MX record for $domain[1]!”;
    //MX记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。MX记录也叫做邮件路由记录,用户可以将该域名下的邮件服务器指向到自己的mail server上,然后即可自行操控所有的邮箱设置。
    ?>
    以上代码返回:
    The domain exists!
    顶
    dns_get_record()函数返回一个数组,包含与hostname指定域有关的各种DNS资源记录。其实,很多时候人都有一种错觉,感觉自己好像通过PHP的代码获得了很多,但或许,早就应该习惯于通过自己的方式整理并梳理出一些看似琐碎的东西。DNS资源记录中的很多看似顺理成章的东西,看似有点晦涩的东西,其实,都可以通过自己的意识去控制,去驾驭,然后在自己接下去的PHP代码和相应概念的学习中发现自己其实有很多值得改进的地方,然后,通过这些点和面之间的接触和融合,很多看似奇怪,看似不够现实化的东西,都开始慢慢渗透入现实,然后,在开始能够改变得到大家的很多固定化的想法和思维方式之后,我们终于在某一个瞬间都清醒地发现其实我们早就应该彻底想通并想清楚很多事。与域有关的所有记录,也许,是一种看似复杂化的,代码堆积之后的必然产物。当然,其实我早就已经发现其实我们应该在我们能够适应这种简单中复杂的时候,闪现出一些看似必要的点和面,然后,通过这些点和面,我们开始发现并挖掘出一些看似能够闪亮许久的点,然后,这些点其实或许就是我们在PHP代码编写过程中必然收获的必要财富,然后,通过这些财富,我们开始收获更多的同时也让我们自己能够成长更多。在我们都愿意发现我们身上那些必然的,必要的闪光点和能够触发程序员光芒的,最为闪耀的时刻。
    array dns_get_record(string hostname [, int type[, array &authns,array &addtl]])
    考虑一个例子,假如希望了解example.com域的更多信息:
    <?php
    $result=dns_get_record(“example.com”);
    //通过dns_get_record函数返回example.com该域名有关的各种DNS资源记录。而且返回的类型是一个数组。
    print_r($result);
    ?>
    以上代码返回的示例信息如下:
    Array(
    [0]=>Array(
    [host]=>example.com
    //host指定所有其他属性对应的DNS命名空间的名。
    [type]=>NS
    //type确定记录类型。根据所返回的类型,还可能返回其他属性。
    [target]=>a.iana-servers.net
    [class]=>IN
    //因为这个函数只返回Internet类的记录,所以此属性总是IN。
    [ttl]=>110275
    //ttl是记录的生存时间,由记录的最初TTL减去查询授权名服务器消耗的时间计算得到。
    )
    [1]=>Array(
    [host]=>example.com
    [type]=>A
    [ip]=>192.0.34.166
    [class]=>IN
    [ttl]=>88674
    )
    )
    如果只对命名服务器记录感兴趣,可以执行如下代码:
    <?php
    $result=dns_get_record(“example.com”,”DNS_CNAME”);
    print_r($result);
    ?>
    以上代码返回如下结果:
    Array([0]=>Array([host]=>example.com [type]=>NS
    [target]=>a.iana-servers.net [class]=>IN [ttl]=>21564)
    [1]=>Array([host]=>example.com [type]=>NS
    [target]=>b.iana-servers.net [class]=>IN [ttl]=>21564))
    getmxrr()函数获取hostname所指定主机的MX记录。其形式为:
    boolean getmxrr(string hostname,array &mxhosts[, array &weight])
    MX记录增加到由mxhosts指定的数组中。如果给出可选的输入参数weight,还会放上相应的重量值,它表示记录标识的各个服务器的访问量。示例如下:
    <?php
    getmxrr(“wjgilmore.com”,$mxhosts);
    print_r($mxhosts);
    ?>
    以上代码返回如下:
    Array([0]=>mail.wjgilmore.com)
    其实,在我们能够适应我们内心中真正愿意闪光的那一个个瞬间的时候,我们其实早就应该已经察觉到也许我们早就应该通过我们自己内心中最为真实的守望,守候到一小段看似必然或者是必经的那些过程,我们,在我们愿意通过我们自己的努力尝试改变命运的时候,总应该学会懂得珍惜并保有更多,同时,我们也不容易真正释放出我们内心中真正愿意渴望的,看似有些遥远的,我们所认为的人生目标。指向我们自己所愿意指向的那一块地域,那一个看似遥远的域名所指向的地方。
    顶
    getservbyname()函数返回指定服务器的端口号,其形式为:
    int getservbyname(string service,string protocol)
    service对应的服务必须在/etc/services文件中指定。protocol参数指定需要此服务的是tcp还是udp部分。考虑一个例子:
    <?php
    echo “HTTP’s default port number is:”.getservbyname(“http”,”tcp”);
    //其中getservbyname函数中的http是指使用的服务名称是http服务,使用的协议是tcp协议。
    ?>
    以上代码返回如下:
    HTTP’s default port number is:80
    getservbyport()函数返回对应于所提供的port号的服务名。其形式为:
    string getservbyport(int port,string protocol)
    protocol参数指定需要此服务的是tcp还是udp部分。考虑一个例子:
    <?php
    echo “Port 80’s default service is:”.getservbyport(80,”tcp”);
    //其中通过getservbyport函数指定端口号是80,指定相对应的协议名是tcp协议。
    ?>
    以上代码返回如下:
    Port 80’s default service is:http
    在今天的网络化环境中,经常需要查询服务,这包括本地和远程查询。通常这是通过与服务建立套接字来完成的。相关的函数是fsockopen(),其形式为:
    resource fsockopen(string target,int port[, int errno [, string errstring[, float timeout>)
    fsockopen()函数在端口port上建立与target所表示资源的连接,在可选参数errno和errstring中返回错误信息。可选参数timeout设置时间限值,以秒为单位,表示函数在失败前多长时间会继续尝试建立连接(也就是说,时间超过此限值后函数才失败)。
    <?php
    //与www.example.com建立一个80端口上的连接
    $http=fsockopen(www.example.com,80);
    //发送请求到服务器
    $req=”GET/HTTP/1.1\r\n”;
    $req.=”Host:www.example.com\r\n”;
    $req.=”Connection:Close\r\n\r\n”;
    fputs($http,$req);
    //通过fputs函数将请求$req中的内容写入$http中。
    //输出请求结果
    while(!feof($http)){
    echo fgets($http,1024);
    //通过fgets函数从$http中返回相对应的数据,大小是1023个字符或一行。
    }
    //关闭连接
    fclose($http);
    ?>
    以上代码会返回如下结果:
    HTTP/1.1 200 OK Date:Mon,09 Oct 2006 23:33:52 GMT Server:Apache/2.0.54(Fedora)
    (Red-Hat/Linux)Last-Modified:Wed,15 Nov 2005 13:24:10 GMT Etag:
    “63ffd-1b6-80bfd280” Accept-Ranges:bytes Content-Length:438
    Connection:close Content-Type:text/html
    You have reached this web page by typing “example.com”,”example.net”,or “example.org” into
    Your web browser.
    These domain names are reserved for use in documentation and are not available for registration
    .See RFC 2606,Section 3.
    其实很多时候我们现实中对于套接字也有一种现实中的定义。就像我们使用聊天软件是一样的道理,你可以跟她或者是他直接聊天,她或者是他也可以跟你直接聊天。这种了解的方式其实本来就是双向的。我开始联想到我曙光中学时期时候的那些事,其实我承认我那个时候一直渴望一个人学习,一个人生活,缺乏了必要的沟通之后我的性格开始变得越来越孤僻,但其实,这种孤僻并不是必然的,而是必经的。很多时候,一个人在人生的长路上遇到某个人或者是某一群人的时候,通过自己的努力尝试融入这个群体,但是到了最后发现其实自己一直都是孤身一人的状态,到底是为了什么,到底是因为什么原因让自己在这个现实中的世界中感觉自己做人有点累呢,其实,我们一直以为这种双向的沟通是看似没有用的,因为人开始因为虚伪,所以,很多人做人的时候都开始变得越来越虚假的同时,没有窥探出一些其他看似必要的东西,其实,我们早就应该学会通过我们自己的认真和努力来尝试做好很多事。不仅仅只是因为我们缺乏我们人生中的套接字,在必然要面对的那个人群面前,我们早就应该学会说服自己相信其实我们是应该能够适应我们内心中所能够形容的那一份份我们所必然尝试想要记忆住的那些东西。在我们都愿意努力尝试的时候,我们开始因为我们人生中的套接字,开始发现并意识到,原来,我们一直都不是孤身一人的状态,所以,我们都应该学会感谢生活,感谢书本的馈赠。
    不知不觉《郎朗的计算机文学)前言加正文8万字了。
    今天之所以用《在前是代表这是我定义中的一本计算机书籍和笔记,用)在后是代表这本书会一直写下去,一直写下去。
    顶
    以下代码是使用fsockopen()创建端口扫描器。
    <?php
    //给予脚本足够的时间去完成相应的任务
    ini_set(“max_execution_time”,120);
    //定义扫描的范围
    $rangeStart=0;
    $rangeStop=1024;
    //在哪个服务器上进行扫描。
    $target=”www.example.com”;
    //构建端口值的数组
    $range=range($rangeStart,$rangeStop);
    echo “

Scan results for $target

”;
    //执行扫描
    foreach($range as $port){
    $result=@fsockopen($target,$port,$errno,$errstr,1);
    if($result) echo”

Socket open at port $port

”;
    }
    ?>
    扫描www.example.com网站,会返回如下结果:
    Scan results for www.example.com:
    Socket open at port 21
    Socket open at port 25
    Socket open at port 80
    Socket open at port 110
    其实有时候你在发邮件的时候会有一种困惑,这种困惑就是到底自己该怎么去通过发送一些看似必要的邮件来跟某个人或者是某个群体有所关联。特别是在投递简历的时候,有时候会收到一些面试失败的邮件。在收件箱里其实静静地躺着很多看似对于你而言负面的东西,但其实我们都应该珍惜这种来之不易地通过自己的努力尝试获取或者是获得的东西,也许,我们在适应我们自己内心中真正孤独的时候,我们往往无法真正释怀很多我们不愿意记忆住的东西。在我们收到恋人或者是朋友发送过来的邮件的时候,我们往往无法真正做到让自己适应自己内心深处潜藏着的一份份叛逆。其实,邮件这东西,看似好像跟现实中的信件关联不是很大,但其实,邮件这东西改变了很多人适应这个信息化时代之后的一种妥协,一种变相地通过自己的努力尝试与这个高新科技时代有所关联的一种最为必要的妥协。我们在适应我们自己所能够形容的妥协的点和方面时,我们往往无法让自己释放在自己愿意释放的世界里,但其实,我们早就应该学会懂得让我们自己都能够学会懂得珍惜更多的同时,收获更多。我们其实早就应该学会珍惜我们现实中一度非常尝试想要去努力找寻的那些东西。但或许,邮件这种东西,在我们能够学会懂得整理并梳理的时候,我们开始学会懂得感谢这些看似不够平凡的东西,同时,这种不平凡,也成就为了我们所无法真正形容和定义中的平凡。PHP的mail()函数有关的配置指令共有5个。
    1.SMTP=string
    作用域:PHP_INT_ALL;默认值:localhost。
    SMTP指令用于设置Windows平台下PHP邮件函数的邮件传输代理(MTA)。
    2.sendmail_from=string
    作用域:PHP_INI_ALL;默认值:Null。
    Sendmail_from指令设置消息首部的From字段。
    3.sendmail_path=string
    作用域:PHP_INI_SYSTEM;默认值:默认的sendmail路径。
    如果sendmail程序不在系统路径中,或者如果需要向sendmail程序传递额外的参数,sendmail_path指令用于设置sendmail二进制程序的路径。
    4.smtp_port=integer
    作用域:PHP_INI_ALL;默认值:25。
    smtp_port指令用于设置连接SMTP指令所指定服务器时使用的端口。
    5.mail.force_extra_parameters=string
    作用域:PHP_INT_SYSTEM;默认值:Null。
    可以使用mail.force_extra_parameters指令向sendmail程序传递额外的标志。
    其实mail()函数这些配置指令,其实给予我们的启示就是,我们不应该以死记硬背的方式尝试想要去搞懂这些配置指令,我们其实早就应该学会懂得珍惜我们现实中一度努力想要寻觅得到的,我们所无法真正形容的这些东西。当然,我们其实早就应该学会适应这种枯燥中的必然,必然中的真正喜悦。
    顶
    可以通过PHP脚本发送电子邮件,只需使用mail()函数。其实很多时候错觉可以带来很多非常惊喜的功能,通过这些功能的组合之后,编程语言开始变得多姿多彩起来,也许,只是为了让自己习惯并适应自己内心中的那一种对于编程语言的极度向往。当然,这种向往,很多时候能够说明并潜在地挖掘出一些看似透明但却非常重要的信息和点,这些信息和点在我从事程序员的工作时一直有所闪现,当然,这种闪现的方式并不仅仅只是因为我尝试想要做到看似做得最好。当然,这种最好的追求方式到底是否正确,还是在矛盾中的正确,其实我早就应该彻底想通的同时,也附加着我所认为的一种奢求,当然,这对于PHP的学习而言,到底是否有益,我并不能够非常明显地说明并解释得清楚。当然,我想,我应该通过这些函数说明了很多问题,同时也表露出了我内心中对于我所认为的高级软件工程师的向往,当然,这种向往,不应该仅仅只是一种空想,这是一种有目标的追求,同时,这种追求的方式,应该是看似正向中的正确,而且不容易轻易改变并放逐自己内心中对于自由,对于真正的编程自由的向往。其形式如下:
    boolean mail(string to,string subject,string message[, string addl_headers[,string addl_params]])
    mail()函数可以向一个或多个接受者发送带有主题和消息的电子邮件。可以通过addl_headers参数调整一些电子邮件属性,甚至可以通过addl_params参数传递额外的标志来修改SMTP服务器的行为。
    通过mail()函数发送最简单的电子邮件是轻而易举的,只需要使用3个必要的参数。
    <?php
    mail(“test@example.com”,”This is a subject”,”This is the mail body”);
    //其中test@example.com是代表发送给谁,This is a subject代表邮件的主题,This is the mail
    //body代表发送邮件中的消息。
    ?>
    当想要向多个接收者发送邮件,用HTML格式的邮件骚扰用户,或者在邮件中包含附件,Mail和Mail_Mime的PEAR包则让这些任务变得轻而易举。这两个包相互结合使用:Mail_Mime创建消息,Mail具体发送。如下代码就是一个相关的例子。
    <?php
    //将Mail和Mime_Mail的包包含进来
    include(“Mail.php”);
    include(“Mail/mime.php”);
    //邮件接收者的名字和邮件地址
    $name=”Jason Gilmore”;
    $recipient=”jason@example.com”;
    //邮件发送方的邮件地址
    $from=”bram@example.com”;
    //邮件CC抄送地址
    $cc=”marketing@example.com”;
    //邮件的主题
    $subject=”Thank you for your inquiry”;
    //E-mail的邮件主体
    $txt=<<<txt
    This is the e-mail message.
    txt;
    //鉴定相关的邮件头
    $headers[‘From’]=$from;
    $headers[‘Cc’]=$subject;
    $headers[‘Subject’]=$subject;
    //实例化Mail_mime类
    $mimemail=new Mail_mime();
    //设置HTML消息
    $mimemail->setTxtBody($html);
    //构建消息
    $message=$mimemail->get();
    //预备好邮件的头
    $mailheaders=$mimemail->headers($headers);
    //创建Mail类的一个新的实例
    $email=&Mail::factory(‘mail’);
    //发送E-mail!
    $email->send($recipient,$mailheaders,$message)or die(“Can’t send message!”);
    ?>
    其实,通过以上代码,我们已经非常容易地发现一旦有了这些已经定义好的包之后,编程开始变得越来越容易,和那些开源的PHP框架是一样的道理,我们其实早就应该学会懂得总结的同时不断创新,然后,再通过自己对于程序语言的追求,更加认真地找寻得到自己在现实中职业的最为真实的定位,同时,还不容易轻易放弃,本来,我们就不应该在程序语言的学习之初就放弃,如果感到烦躁的时候,不如给你的导师发送一份看似挺必要的电子邮件吧。
首页 上一页[1] 本页[2] 下一页[3] 尾页[4] [收藏本文] 【下载本文】
  小说文学 最新文章
长篇小说《程咬金日记》寻出版、网剧、动漫
亲身经历我在泰国卖佛牌的那几年(转载)
噩梦到天堂——离婚四年成长史
午夜咖啡馆
原创长篇小说:城外城
长篇小说《苍天无声》打工漂泊望乡路底层小
郭沫若用四字骂鲁迅,鲁迅加一字回骂,世人
原创先秦历史小说,古色古香《玉之觞》
北京黑镜头(纪实文学)
长篇连载原创《黑潭》
上一篇文章      下一篇文章      查看所有文章
加:2021-06-29 10:19:09  更:2021-06-29 10:20:48 
 
古典名著 名著精选 外国名著 儿童童话 武侠小说 名人传记 学习励志 诗词散文 经典故事 其它杂谈
小说文学 恐怖推理 感情生活 瓶邪 原创小说 小说 故事 鬼故事 微小说 文学 耽美 师生 内向 成功 潇湘溪苑
旧巷笙歌 花千骨 剑来 万相之王 深空彼岸 浅浅寂寞 yy小说吧 穿越小说 校园小说 武侠小说 言情小说 玄幻小说 经典语录 三国演义 西游记 红楼梦 水浒传 古诗 易经 后宫 鼠猫 美文 坏蛋 对联 读后感 文字吧 武动乾坤 遮天 凡人修仙传 吞噬星空 盗墓笔记 斗破苍穹 绝世唐门 龙王传说 诛仙 庶女有毒 哈利波特 雪中悍刀行 知否知否应是绿肥红瘦 极品家丁 龙族 玄界之门 莽荒纪 全职高手 心理罪 校花的贴身高手 美人为馅 三体 我欲封天 少年王
旧巷笙歌 花千骨 剑来 万相之王 深空彼岸 天阿降临 重生唐三 最强狂兵 邻家天使大人把我变成废人这事 顶级弃少 大奉打更人 剑道第一仙 一剑独尊 剑仙在此 渡劫之王 第九特区 不败战神 星门 圣墟
  网站联系: qq:121756557 email:121756557@qq.com