资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
第七节:内容的格式和提交篇现在我们基本上已经大功告成了。我们已经设计了一个数据库用来存储笑话,将它们组织到目录中,并标志它们的作者。我们也已经学会了如何建立一个Web页来向我们的访问者显示我们的笑话库。我们还开发了一系列的Web页以使得网站的管理者不需要任何数据库的知识就能管理笑话库。当我们这样做之后,我们已经解决了这么一个头疼的问题,那就是不断地插入新的内容到HTML模板中,并产生大量难管理的HTML文件。现在,HTML已经完全和显示的数据分开了。如果你想重新设置这个网站,你只需要改变显示给访问者的PHP文件中的HTML。对一个文件夹的修改(例如改变字体)会立即反映到所有笑话的显示,因为所有的笑话都使用同一个PHP文件来显示。在管理这个Web站点的内容时仅仅还有一个情况需要用到HTML:内容的格式。除了一些最简单的Web站点之外,我们总是需要允许内容(在这里是指笑话)有自己可应用的格式。一个简单的情况是,你仅需要能将文本分段。然而,更通常的情况是,内容的提供者还希望能够简单地实现文字的粗体、斜体或者是超连接等等。我们目前的数据库和网站设计支持所有的这些功能,因为一个网站的管理者可以在笑话的内容中包含HTML标志,而在将笑话的内容插入到网站的访问者请求的页面中时也能起到它当初的效果。然而,为了实现我们系统管理完全不需要HTML的知识,我们需要提供一些其它的方法以格式化文本。在本章中,我们会学习一些新的PHP函数,这些函数可以让我们能够提供基本的文本格式而不需要使用HTML。当我们这样做了之后,我们会真正拥有一个足够简单的可以供第一个有Web浏览器的人使用的内容管理系统。有了这个功能之后,我们可以再次允许用户提供它们自己的笑话-而这一次,我们不必再担心我们的站点会充满令人讨厌的或其它不适当的东西。排除原有的干扰在我们提供一个有关格式化内容的新的方法之前,我们首先必须排除旧东西的影响。一些没有HTML知识的人可能会不知不觉地在一个纯文本的文档中包含HTML语法(然而是无效的),这将引起意想不到的后果,甚至会损坏我们的页面的显示效果。我们先来看看下面的句子:Thegunmandrewhisweapon.如果有人将上面的文字录入到数据库中,在Web页显示这个内容他也许会奇怪最后的那个单词()怎么不见。有一些基本的HTML知识的人会意识到Web浏览器已经将这一段作为无效的HTML标志忽略了,但是我们需要迎合根本没有任何HTML知识的用户。在第五章中,我们曾经看到一个PHP函数可以巧妙地处理这个问题:htmlspecialchars。这个函数在将我们的笑话插入到一个Web页时,将其转换成一种“HTML安全”的格式:Thegunmandrewhisweapon.<BANG!>当反馈到网站访问者的Web浏览器时,这会显示出我们当初所预想的结果。因此,作为第一步,我们需要修改我们的网站用来显示笑话内容的PHP文件,在文本输出到页面之前使用htmlspecialchars:./Getthejoketextfromthedatabase$joke=mysql_query(SELECTJokeTextFROMJokes.WHEREID=$id);$joke=mysql_fetch_array($joke);$joketext=$jokeJokeText;/FilteroutHTMLcode$joketext=htmlspecialchars($joketext);echo($joketext);.我们已经使出现在内容中的HTML代码失效了。现在我们可以通过执行我们自己的特别的标志语言来执行我们自己的内容格式。正则表达式执行我们自己的标志语言会包含在笑话的文本中找出我们自己的标志并在输出到用户的浏览器前将其替换成相应的HTML。每一个了解正则表达式的人都会意识到使用与此正则表达式很适合于处理这些工作。一个正则表达式是一个可能包含指定代码的字符串,它可以被一些PHP函数用来搜寻和处理文本。下面的这个例子就是一个正则表达式,它可以用来搜索“PHP”(没有引号):PHP不太复杂,是吗?要使用一个正则表达式,你必须熟悉PHP中使用正则表达式的函数。ereg是其中最基本的,它可以用来判断一个正则表达式是否匹配具体的字符串。请参看下面这段代码:$text=PHPrules!;if(ereg(PHP,$text)echo($textcontainsthestringPHP.);elseecho($textdoesnotcontainthestringPHP.);在这个例子中,正则表达式是匹配的,因为存储在变量$text中值包含“PHP”。这样,上面的代码的输出将是这样的(注意这里的单引号使用PHP不会用相应的$text的值取代$text):$textcontainsthestringPHP.eregi的功能基本上和ereg相同,只是它忽略被搜索的文本的大小写:$text=WhatisPhp?;if(eregi(PHP,$text)echo($textcontainsthestringPHP.);elseecho($textdoesnotcontainthestringPHP.);这会输出同样的信息:$textcontainsthestringPHP.正如我们上面提到的,在正则表达式中可以使用一些特殊的代码。其中的一些代码可以容易混淆,而且也很难记,如果你想要很好地使用它,你需要找到一本好的参考。有关标准正则表达式的语法的指南格式的参考你可以从http:/www.delorie.com/gnu/docs/rx/rx_toc.html中找到,在WroxPress编写的专业PHP程序设计一书的附录中也包含了正则表达式语法的参考。让我们通过一些例子来学习一些基本的正则表达式的语法。首先,一个脱字符()被用来标志字符串的开始,而一个美元符($)被用来标志字符串的结束:PHP/匹配WhatisPHP?PHP/匹配PHPrules!但不匹配WhatisPHP?PHP$/匹配IlovePHP但不匹配WhatisPHP?PHP$/只匹配PHP明显地,你们有时会想要使用、$或其它一些特殊字符来表示在搜索字符串中的相应的字符,而不是它们在正则表达式中的相应的特殊含义。要达到这个目的,你只需要在前面添加一个反斜杠:$/匹配Showmethe$!方括号可以用来定义一组可以匹配的字符。例如,下面的正则表达式可以匹配1到5的任何数字。12345/匹配1和3,但不匹配a或12数字和字母的范围也可以这样表示:1-5/和前面一样a-z/匹配所有小写字母0-9a-zA-Z/匹配所有字母或数字字符?、+和*也有其各自特殊的含义。具体地说,?表示“前面的字符是可选的”,+表示“前面的字符重复一次或多次”,而*表示“前面的字符重复零次或多次”。bana?na/匹配banana和banna,/但不匹配banaana.bana+na/匹配banana和banaana,/但不匹配banna.bana*na/匹配banna、banana和banaaana,/但不匹配bnana.a-zA-z+$/匹配所有由仅由一个或多个字母组成的字符串。圆括号用来将字符组合起来作为一个整体来应用?、+和*。ba(na)+na/匹配banana和banananana,/但不匹配bana或banaana.这儿有一些代码用来在正则表达式中匹配特殊的字符:/匹配一个换行符./匹配除了换行符以外的所有其它字符/匹配一个回车符/匹配一个制表符在正则表达式中还有许多其它的特殊代码和语法,这些你都可以从一些参考书中获得(例如我们上面提到的)。现在,要达到我们的目的,这些已经足够了。用正则表达式进行字符串的替换使用一个我们刚刚学习过的带正则表达式的ereg或eregi,我们可以很容易地判断在给出的字符串中是否包括标志。然而,我们想要做的是找出这些标志并将其替换成相应的HTML标志。要完成这一功能,我们需要PHP提供的另两个正则表达式函数:ereg_replace和eregi_replace。ereg_replace,和ereg一样,接受一个正则表达式和一个文本字符串,并试图将二者进行匹配。然而,此外,ereg_replace还接受第二个文本字符串,并用其替换第一个文本字符串中每一个和正则表达式匹配的部分。ereg_replace的语法如下所示:$newstring=ereg_replace(,);在这里,是一个正则表达式,是我们用来替换在中匹配的部分的字符串。这个函数返回替换后的字符串。在上面的代码中,新的字符串被存储在$newstring中。eregi_replace,和我们预想的一样,基本上等同于ereg_replace,只是它要匹配时不考虑字母的大小写。现在我们已经准备好建立我们自己的标志语言了。黑体和斜体让我们首先实现建立文本的黑体和斜体的标志。我们定义B开始黑体文本,而EB结束一个黑体文本。明显地,我们需要将B替换为,而将EB替换为。使用eregi_replace这将变得很简单:$joketext=eregi_replace(b,$joketext);$joketext=eregi_replace(eb,$joketext);请注意,因为在正则表达式中通常是指一组可接受的字符的开始,所以我们在前面加了一个反斜杠以去除其特殊的含义。而没有了,也不再具有特殊的含义,因此不需要反斜杠,当然,如果你想做得更彻底,你也可以在前面添加一个反斜杠。另外还请注意,我们在这里使用的是eregi_replace,它是对大小写不敏感的,因此B和b在我们自己的标志语言会起到同样的作用。斜体可以通过同样的方法实现:$joketext=eregi_replace(i,$joketext);$joketext=eregi_replace(ei,$joketext);分段要实现分段和前面我们实现黑体和斜体一样,甚至还更为简单。因为用户在将内容录入到表单域中时,会使用回车键来格式化文本,我们使用单个的换行符()来代表换行(),而两个换行符()则代表分段()。当然,由于PC会用一对换行-回车符()来表示新的一行,我们首先需要删除回车符,代码将是这样的:/删除回车符$joketext=ereg_replace(,$joketext);/处理分段$joketext=ereg_replace(,$joketext);/处理换行$joketext=ereg_replace(,$joketext);这就是我们想要的!现在文本可以象用户所预期的那样分段了,而他们甚至不需要学习任何特殊的标志。超链接
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号