大家帮解释几个函数!谢了

benben1982 2003-08-20 02:03:17
function run($proc="") {
ob_start();
include($proc);
$this->length = ob_get_length();
$this->buffer = ob_get_contents();
$this->buffer = eregi_replace("\r?\n","\r\n",$this->buffer);
ob_end_clean();
}
我的理解:
此函数的基本用意是在缓存中生成一个静态页面这个页面由include($proc)指定.
不知道这么解释是否正确?


其中ob_start,ob_get_length,ob_get_contents,ob_end_clean这几个函数不太明白请作解释,或它们的用处!
还有此句:eregi_replace("\r?\n","\r\n",$this->buffer)的用意何在????!!!
谢谢!
...全文
26 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuiaaa 2003-08-22
  • 打赏
  • 举报
回复
用一个我们刚刚学习过的带正则表达式的ereg或eregi,我们可以很容易地判断在给出的字符串中是否包括标志。然而,我们想要做的是找出这些标志并将其替换成相应的HTML标志。要完成这一功能,我们需要PHP提供的另两个正则表达式函数:ereg_replace和eregi_replace。

ereg_replace,和ereg一样,接受一个正则表达式和一个文本字符串,并试图将二者进行匹配。然而,此外,ereg_replace还接受第二个文本字符串,并用其替换第一个文本字符串中每一个和正则表达式匹配的部分。

ereg_replace的语法如下所示:

$newstring=ereg_replace(<regexp>,<replacewith>,<oldstring>);


在这里,<regexp>是一个正则表达式,<replacewith>是我们用来替换<regexp>在<oldstring>中匹配的部分的字符串。这个函数返回替换后的字符串。在上面的代码中,新的字符串被存储在$newstring中。

eregi_replace,和我们预想的一样,基本上等同于ereg_replace,只是它要匹配时不考虑字母的大小写。

现在我们已经准备好建立我们自己的标志语言了。

黑体和斜体

让我们首先实现建立文本的黑体和斜体的标志。我们定义[B]开始黑体文本,而[EB]结束一个黑体文本。明显地,我们需要将[B]替换为<B>,而将[EB]替换为</B>。使用eregi_replace这将变得很简单:

$joketext=eregi_replace("[b]","<B>",$joketext);
$joketext=eregi_replace("[eb]","</B>",$joketext);



请注意,因为[在正则表达式中通常是指一组可接受的字符的开始,所以我们在前面加了一个反斜杠以去除其特殊的含义。而没有了[,]也不再具有特殊的含义,因此不需要反斜杠,当然,如果你想做得更彻底,你也可以在前面添加一个反斜杠。

另外还请注意,我们在这里使用的是eregi_replace,它是对大小写不敏感的,因此[B]和[b]在我们自己的标志语言会起到同样的作用。

斜体可以通过同样的方法实现:

$joketext=eregi_replace("[i]","<I>",$joketext);
$joketext=eregi_replace("[ei]","</I>",$joketext);



分段

要实现分段和前面我们实现黑体和斜体一样,甚至还更为简单。因为用户在将内容录入到表单域中时,会使用回车键来格式化文本,我们使用单个的换行符()来代表换行(<BR>),而两个换行符(
)则代表分段(<P>)。当然,由于PC会用一对换行-回车符()来表示新的一行,我们首先需要删除回车符,代码将是这样的:

//删除回车符

$joketext=ereg_replace("","",$joketext);
//处理分段
$joketext=ereg_replace("","<P>",$joketext);
//处理换行
$joketext=ereg_replace("","<BR>",$joketext);



这就是我们想要的!现在文本可以象用户所预期的那样分段了,而他们甚至不需要学习任何特殊的标志。

超链接

虽然在笑话的内容中支持超链接似乎很可笑,但在其它应用程序中经常会有这种应用。超链接要比简单地将一些代码转换成HTML标志稍微复杂一些。因为我们同时要输出URL和链接显示的内容。

这里,我们需要用到ereg_replace和eregi_replace的另一个特征了。通过圆括号将正则表达式分成几部分,你可以“获得”匹配的文本中相应的部分并在替代的字符串中用代码\n表示,这里n中的1表示正则表达式第一个圆括号中的部分,2表示第二个,一直到9表示第9个。请先参考下面的代码:

$text="banana";
$text=eregi_replace("(.*)(nana)","\2\1",$text);
echo($text);//outputs"nanaba"



在上面的代码中,替代字符串中的\1由ba取代,这对应于正则表达式中的(.*)(零个或更多个非换行符)。\2由nana取代,这对应于正则表达式中的(nana)。

在建立我们的超链接时可以使用同样的规则。让我们先从一个简单的连接开始,这里链接的文本同时也是URL。我们需要支持下面的语句:

Visit[L]http://www.php.net/[EL].


我们想要输出的相应的HTML代码是这样的:

Visit<AHREF="http://www.php.net/";>http://www.php.net/<;/A>.


首先,我们需要一个正则表达式以匹配这种格式的链接。这个正则表达式将是这样的:

[L][-_./a-zA-Z0-9!&%#?,'=:~]+[EL]


我们又在[L]和[EL]的前面用了反斜杠,这标志着它们将按字面意思解释。我们使用了方括号列出了我们认为可以作为URL的一部分的所有字符。在这个方括号后面我们使用了一个+表示URL可以由其中的一个或多个字符组成。

要输出我们的链接,我们需要取出URL同时作为A标签的HREF属性以及链接的文字来输出。要取出URL,我们需要在我们的正则表达式的相应的部分上加上圆括号:

[L]([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]


于是我们用下面的代码对链接进行转换:

$joketext=ereg_replace(
"[L]([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]",
"<AHREF="\1">\1</A>",$joketext);



请注意我们在链接的HTML代码中的双引号前面使用了反斜杠以防止PHP将其误以为是替代字符串的起止引号。总之,\1被这个链接的URL所取代,而输出正是我们所期望的!

我们还希望支持这样的超链接,那就是链接的文字和他们的URL不一样。这样的链接的格式如下所示:

Checkout[L=http://www.php.net/]PHP[EL].


这是我们的正则表达式:

[L=([-_./a-zA-Z0-9!&%#?,'=:~]+)]([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]


相当混乱,是吗?先不要去管它,你会明白这正是你所需要的,你会同时取出这个链接的URL(\1)和文字(\2)。执行这个转换的PHP代码将是这样的:

$joketext=ereg_replace(
"[L=([-_./a-zA-Z0-9!&%#?,'=:~]+)]".
"([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]",
"<AHREF="\1">\2</A>",$joketext);



内容的分页

虽然也许没有笑话会长得要分页显示,但是许多内容驱动的站点防止内容过长的最好的方法就是将其分页显示。使用PHP的另一个正则表达式的函数可以很容易地实现这种功能。

split是这样一个函数:它接受一个正则表达式和一个文本字符串并通过字符串对正则表达式的匹配将其分开,并存储到数组中。参看下面的例子:

$regexp="[]+";//一个或更多的空白字符
$text="Thisisatest.";
$textarray=split($regexp,$text);
echo("$textarray[0]<BR>");//输出"This<BR>"
echo("$textarray[1]<BR>");//输出"is<BR>"
echo("$textarray[2]<BR>");//输出"a<BR>"
echo("$textarray[3]<BR>");//输出"test.<BR>"



如果用一个[PAGEBREAK]标志取代这里的空白字符,并用显示我们感兴趣的页面(在页面请求中通过$page变量传递)取代显示全部的划分结果,我们就可以成功将内容分页。

//Ifnopagespecified,defaulttothe
//firstpage($page=0)
if(!isset($page))$page=0;
//Splitthetextintoanarrayofpages
$textarray=split("[PAGEBREAK]",$text);
//Selectthepagewewant
$pagetext=$textarray[$page];



当然,我们需要提供一些方法以在页面之间进行切换。我们可以在当前页的顶端放置一个到上一页的链接,在底端放置一个到下一页的链接。

如果这是第一页,我们就不需要一个到上一页的链接。我们知道如果$page变量等于零就意味着当前页是第一页。同样地,在最后一页我们也不需要到下一页的链接。要确定当前页是不是最后一页,我们需要一个新的名为count的PHP的函数,它以一个数组为参数并返回数组的数目。通过页面的数组,count会告诉我们这儿有多少页。如果有10页,那么$textarray[9]就是最后一页。这样,如果$page等于count($textarray)减一就说明当前页是最后一页。

有关我们的页面切换的链接的代码将是这样的:

if($page!=0){
$prevpage=$page-1;
echo("<P><AHREF="$PHP_SELF?id=$id&page=$prevpage">".
"PreviousPage</A></P>");
}
//Outputpagecontenthere...
if($page<count($textarray)-1){
$nextpage=$page+1;
echo("<P><AHREF="$PHP_SELF?id=$id&page=$nextpage">".
"NextPage</A></P>");
}



进行组装

完整的用来输出我们的笑话的内容的代码(包含了对所有特殊字符和自定义标志的转换)如下所示:

<!--joke.php-->
...
//Getthejoketextfromthedatabase
$joke=mysql_query("SELECTJokeTextFROMJokes".
"WHEREID=$id");
$joke=mysql_fetch_array($joke);
$joketext=$joke["JokeText"];
//FilteroutHTMLcode
$joketext=htmlspecialchars($joketext);
//Ifnopagespecified,defaulttothe
//firstpage($page=0)
if(!isset($page))$page=0;
//Splitthetextintoanarrayofpages
$textarray=split("[PAGEBREAK]",$joketext);
//Selectthepagewewant
$joketext=$textarray[$page];
//Boldanditalics
$joketext=eregi_replace("[b]","<B>",$joketext);
$joketext=eregi_replace("[eb]","</B>",$joketext);
$joketext=eregi_replace("[i]","<I>",$joketext);
$joketext=eregi_replace("[ei]","</I>",$joketext);
//Paragraphsandlinebreaks
$joketext=ereg_replace("","",$joketext);
$joketext=ereg_replace("","<P>",$joketext);
$joketext=ereg_replace("","<BR>",$joketext);
//Hyperlinks
$joketext=ereg_replace(
"[L]([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]",
"<AHREF="\1">\1</A>",$joketext);
$joketext=ereg_replace(
"[L=([-_./a-zA-Z0-9!&%#?,'=:~]+)]".
"([-_./a-zA-Z0-9!&%#?,'=:~]+)[EL]",
"<AHREF="\1">\2</A>",$joketext);
if($page!=0){
$prevpage=$page-1;
echo("<P><AHREF="$PHP_SELF?id=$id&page=$prevpage">".
"PreviousPage</A></P>");
}
echo("<P>$joketext");
if($page<count($textarray)-1){
$nextpage=$page+1;
echo("<P><AHREF="$PHP_SELF?id=$id&page=$nextpage">".
"NextPage</A></P>");
}
...
shuiaaa 2003-08-22
  • 打赏
  • 举报
回复
处理输出缓冲的函数主要有这么几个:
ob_start() 开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里.

ob_get_contents() 这个函数返回内部缓冲的内容. 这就等于把这些输出都变成了字符串.

ob_get_ length() 返回内部缓冲的长度.

ob_end_flush() 结束输出缓冲, 并输出缓冲里的内容. 在这以后的输出都是正常输出.

ob_end_clean() 结束输出缓冲, 并扔掉缓冲里的内容.

举个例子, var_dump()函数输出一个变量的结构和内容, 这在调试的时候很有用.
但如果变量的内容里有 < , > 等HTML的特殊字符, 输出到网页里就看不见了. 怎么办呢?
用输出缓冲函数能很容易的解决这个问题.

ob_start();
var_dump($var);
$out = ob_get_contents();
ob_end_clean();


这时var_dump()的输出已经存在 $out 里了. 你可以现在就输出:

echo '<pre>' . htmlspecialchars($out) . '</pre>' ;

或者等到将来, 再或者把这个字符串送到模板(Template)里再输出.
_____________________________________________________________
xuzuning 2003-08-22
  • 打赏
  • 举报
回复
eregi_replace("\r?\n","\r\n",$this->buffer)的用意何在?
把可能的unix格式转换为dos格式。以保证在windows下的可读性。
如只会在unix、linux阅读,可eregi_replace("\r\n","\n",$this->buffer)。
否则这个"\r"在vi里是"^M",很讨厌。如同单独的"\n"在windows的notepad里是小黑块一般。
benben1982 2003-08-22
  • 打赏
  • 举报
回复
那么eregi_replace("\r?\n","\r\n",$this->buffer)的用意何在????!!!

benben1982 2003-08-20
  • 打赏
  • 举报
回复
TO: myblessu(寒飞)
大侠!我外语好就上着来发贴了~嗨!之怪小弟学艺不精呀!不过还是谢谢!
xuzuning 2003-08-20
  • 打赏
  • 举报
回复
PHP4 的输出信息控制函数

这些函数可以让你控制你的脚本输出的内容.可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头新的情况. 输出控制函数不对使用 header() 或 setcookie() 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用.

例 1. 控制输出

<?php

ob_start();
echo "Hello\n";

setcookie ("cookiename", "cookiedata");

ob_end_flush();

?>

在上面的例子中,使用 echo() 的输出内容将会保存在输出缓冲区中,直到调用了 ob_end_flush(). 这样做有意义的地方是,调用 setcookie() 的内容被成功的存储在 cookie 里面而不会引起错误. (正常情况下,你不可以在有数据已经发送后再发送文件头信息到用户浏览器.)

相关函数 header() and setcookie().

韩数列表
flush — 刷新输出缓冲区
保存在输出缓冲区的内容会被发送到浏览器

ob_start — 打开输出缓冲区
这样所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面

ob_get_contents — 返回输出缓冲区的内容
如果你想以后处理输出的内容,可以调用这个函数保留一个备份

ob_get_length — 返回输出缓冲区的内容长度

ob_end_flush — 结束(发送)输出缓冲区的内容,关闭输出缓冲区

ob_end_clean — 删除(放弃)输出缓冲区的内容,关闭输出缓冲区
如果你的程序发现输出内容有问题,可以放弃所有输出内容,可以防止泄漏某些秘密信息

ob_implicit_flush — 打开或关闭直接刷新
打开后,每个脚本输出都直接发送到浏览器,不再需要调用 flush(),

myblessu 2003-08-20
  • 打赏
  • 举报
回复
看看手册吧,我把链接给你找好了.

ob_start: http://cn.php.net/manual/zh/function.ob-start.php
ob_get_length: http://cn.php.net/manual/zh/function.ob-get-length.php
ob_get_contents: http://cn.php.net/manual/zh/function.ob-get-contents.php
ob_end_clean: http://cn.php.net/manual/zh/function.ob-end-clean.php
eregi_replace: http://cn.php.net/manual/zh/function.eregi-replace.php

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧