小妖女 发表于 2015-2-4 00:26:54

PHP编程:若何用PHP把RDF内容拔出Web站点当中(四...

那么接下来,这就算学会啦?NO,NO,NO,还早呢,你至尽还没碰过OOP之类的吧?模板呢?web|拔出|站点   前往到类(Back To Class)

既然你有这么大的权利,那末事实为何要把本人限制在仅仅是单个的RDF来历呢?就象我新近说过的一样,大多半次要的站点都常常为他们所供应的内容做快照。其实将一切这些分歧的来历拔出到你的站点傍边是相当复杂的。让咱们看看是若何做的。

起首,咱们把后面例子中的代码模块化。如许一来,你就不必为每个单个的来历都一遍又一遍的重写不异的代码了。简化的办法就是将之打包成类,再把这个类包括到我的PHP剧本傍边。

类代码以下:

<?
class RDFParser
{
//
// variables
//

// set up local variables for this class
var $currentTag = "";
var $flag = "";
var $count = 0;

// this is an associative array of channel data with keys
("title", "link", "description")
var $channel = array();

// this is an array of arrays, with each array element
representing an <item>
// each outer array element is itself an associative array
// with keys ("title", "link", "description")
var $items = array();


//
// methods
//

// set the name of the RDF file to parse
// this is usually a local file
// you may set it to a remote file if your PHP build supports
URL fopen()
function setResource($file)
{
$this->file = $file;
}


// parse the RDF file set with setResource()
// this populates the $channel and $items arrays
function parseResource()
{
// create parser
$this->xp = xml_parser_create();

// set object reference
xml_set_object($this->xp, $this);

// set handlers and parser options
xml_set_element_handler($this->xp, "elementBegin",
"elementEnd");
xml_set_character_data_handler($this->xp,
"characterData");
xml_parser_set_option($this->xp,
XML_OPTION_CASE_FOLDING, TRUE);
xml_parser_set_option($this->xp, XML_OPTION_SKIP_WHITE,
TRUE);

// read XML file
if (!($fp = fopen($this->file, "r")))
{
die("Could not read $this->file");
}

// parse data
while ($xml = fread($fp, 4096))
{
if (!xml_parse($this->xp, $xml, feof($fp)))
{
die("XML parser error: " .
xml_error_string(xml_get_error_code($this->xp)));
}
}

// destroy parser
xml_parser_free($this->xp);
}

// opening tag handler
function elementBegin($parser, $name, $attributes)
{
$this->currentTag = $name;
// set flag if entering <channel> or <item> block
if ($name == "ITEM")
{
$this->flag = 1;
}
else if ($name == "CHANNEL")
{
$this->flag = 2;
}
}

// closing tag handler
function elementEnd($parser, $name)
{
$this->currentTag = "";

// set flag if exiting <channel> or <item> block
if ($name == "ITEM")
{
$this->count++;
$this->flag = 0;
}
else if ($name == "CHANNEL")
{
$this->flag = 0;
}
}

// character data handler
function characterData($parser, $data)
{
$data = trim(htmlspecialchars($data));
if ($this->currentTag == "TITLE" || $this->currentTag ==
"LINK" || $this->currentTag == "DESCRIPTION")
{
// add data to $channels[] or $items[] array
if ($this->flag == 1)
{

$this->items[$this->count] .= $data;
}
else if ($this->flag == 2)
{

$this->channel .= $data;
}
}
}

// return an associative array containing channel information
// (the $channel[] array)
function getChannelInfo()
{
return $this->channel;
}

// return an associative array of arrays containing item
information
// (the $items[] array)
function getItems()
{
return $this->items;
}

}
?>
假如你对PHP类较为熟习的话,那末了解这段代码是相当轻易的。假如不太懂的话,那末请直接跳到文章末尾的链接局部,看一篇关于类任务道理的好文章。然后在回来持续浏览下面的代码。

在利用这个类之前,我要出格花几分钟指出个中的一行代码――即下面对xml_set_object()函数挪用的那一行。

如今的成绩是若何利用这个类实践生成具有多个内容来历的Web页。

<?
include("class.RDFParser.php");
// how many items to display in each channel
$maxItems = 5;
?>
<html>
<head>
<basefont face="Verdana">
<body>

<table width="100%" border="0" cellspacing="5" cellpadding="5"> <tr>
<!-- first cell -->
<td valign=top align=left>
<font size="-1">
<?
// get and parse freshmeat.net channel
$f = new RDFParser();
$f->setResource("http://www.freshmeat.net/backend/fm-releases.rdf");
$f->parseResource();
$f_channel = $f->getChannelInfo();
$f_items = $f->getItems();
// now format and print it...
?>
The latest from <a href=<? echo $f_channel["link"]; ?>><? echo
$f_channel["title"]; ?></a> <br> <ul> <? // iterate through items array
for ($x=0; $x<$maxItems; $x++) {
if (is_array($f_items[$x]))
{
// print data
$item = $f_items[$x];
echo "<li><a href=" . $item["link"] . ">" .
$item["title"] . "</a>";
}
}
?>
</ul>
</font>
</td>

<!-- second cell -->
<td align=center width=50%>
<i>Primary page content here</i>
</td>

<!-- third cell -->
<td valign=top align=left>
<font size="-1">
<?
// get and parse slashdot.org channel
$s = new RDFParser();
$s->setResource("http://slashdot.org/slashdot.rdf");
$s->parseResource();
$s_channel = $s->getChannelInfo();
$s_items = $s->getItems();
// now format and print it...
?>
The latest from <a href=<? echo $s_channel["link"]; ?>><? echo
$s_channel["title"]; ?></a> <br> <ul> <? // iterate through items array
for ($x=0; $x<$maxItems; $x++) {
if (is_array($s_items[$x]))
{
// print data
$item = $s_items[$x];
echo "<li><a href=" . $item["link"] . ">" .
$item["title"] . "</a>";
}
}
?>
</ul>
</font>
</td>

</tr>
</table>

</body>
</head>
</html>


这段代码相当复杂。一旦你用“new”关头字生成一个类的实例,

$f = new RDFParser();

那末就能够用类办法来设置要剖析的RDF文件的地位,

$f->setResource("http://www.freshmeat.net/backend/fm-releases.rdf");
$f->parseResource();
而且获得$channel和$items数组,以用于前面的处置。



<?
$f_channel = $f->getChannelInfo();
$f_items = $f->getItems();
?>

The latest from <a href=<? echo $f_channel["link"]; ?>><? echo
$f_channel["title"]; ?></a> <br> <ul> <? // iterate through items array
for ($x=0; $x<$maxItems; $x++) {
if (is_array($f_items[$x]))
{
// print data
$item = $f_items[$x];
echo "<li><a href=" . $item["link"] . ">" .
$item["title"] . "</a>";
}
}
?>
</ul>


每次你从头装入下面的剧本,响应的RDF文件就会被从特定的地位上取来,经由剖析以后,按请求的格局显示出来。

假如你站点具有高的会见量,你便可能感觉咱们的辛劳有意义之极,特别是当所用的RDF数据更新地没有那末快时,情形更糟。 在这类情形下,也许探求一下在当地缓存RDF数据才是较明智的做法:要末扩大下面的例子法式,在个中到场缓存功效;要末每阁几个小时都花很长的工夫下载一个最新RDF文件的当地正本到你的Web办事器上,然后利用这个当地正本,而不是谁人“活”的(the “live” one)。

不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。

谁可相欹 发表于 2015-2-4 13:09:01

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

若相依 发表于 2015-2-7 19:04:55

Ps:以上纯属原创,如有雷同,纯属巧合

飘灵儿 发表于 2015-3-3 19:24:34

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

冷月葬花魂 发表于 2015-3-10 19:16:39

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

小女巫 发表于 2015-3-17 09:10:39

没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。

飘飘悠悠 发表于 2015-3-17 09:11:25

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

不帅 发表于 2015-3-24 05:37:13

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

admin 发表于 2015-4-5 17:54:35

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

简单生活 发表于 2015-4-13 07:27:56

建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。

第二个灵魂 发表于 2015-4-16 16:47:01

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

仓酷云 发表于 2015-4-20 11:24:33

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

活着的死人 发表于 2015-4-23 02:32:46

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

若天明 发表于 2015-6-28 03:38:35

开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。

只想知道 发表于 2015-7-2 17:28:40

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

深爱那片海 发表于 2015-7-4 22:01:10

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

柔情似水 发表于 2015-7-9 10:15:01

写的比较杂,因为我也是个新手,不当至于大家多多指正。

海妖 发表于 2015-7-10 20:58:23

建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。

山那边是海 发表于 2015-7-13 21:54:25

我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
页: [1]
查看完整版本: PHP编程:若何用PHP把RDF内容拔出Web站点当中(四...