以下代码来自http://d.hatena.ne.jp/dix3/20081002/1222899116,代码运作良好。
这是在codeigniter中使用snoopy的示例。
Q1。我是否正确地说我不能使用,
$this -> load -> library('snoopy')
因为Snoopy.php不会创建对象。以下示例是如何做到的? 如果是这样,你可以向我解释/指导如何详细说明的教程或解释吗?
if ( ! class_exists('Snoopy'))
{
require_once(APPPATH.'libraries/Snoopy'.EXT);
}
Q2。为什么作者使用
$to_specialchars=true
是否需要这个?
Q3。你能解释APPPATH和EXT。
APPPATH.'libraries/Snoopy'.EXT
我在php.net中查了但是我找不到它。 EXT必须是扩展名,但我可以在任何地方使用吗?
提前致谢。
我在application / library / Snoopy.php中有一个史努比
我有application / library / Snoopy.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Scraping{
var $c;
function Scraping(){
if ( ! class_exists('Snoopy'))
{
require_once(APPPATH.'libraries/Snoopy'.EXT);
}
$this -> c = new Snoopy();
}
function getWebHtml($url="",$to_specialchars=true){
$this ->c -> fetch( $url );
$str = mb_convert_encoding( (string) $this -> c -> results,"UTF-8","auto");
return ($to_specialchars) ? htmlspecialchars($str , ENT_QUOTES , "UTF-8" ) : $str ;
}
function getWebText($url="",$to_specialchars=true){
$this -> c -> fetchtext( $url );
$str = mb_convert_encoding( (string) $this -> c -> results,"UTF-8","auto");
return ($to_specialchars) ? htmlspecialchars($str , ENT_QUOTES , "UTF-8" ) : $str ;
}
function getWebLinks($url=""){
$this -> c -> fetchlinks( $url );
return (array) $this-> c -> results ;
}
function getWebLinksText($url="",$delimiter="<br>"){
$arr = $this-> getWebLinks($url) ;
$ret ="";
foreach($arr as $k => $v){
$ret .= $v . $delimiter ;
}
return $ret;
}
} //endofclass
/* End of file Scraping.php */
/* Location: ./application/libraries/Scraping.php */
?>
我有一个控制器应用程序/ controller / mytasklist.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Mytasklist extends Controller {
function Mytasklist()
{
parent :: Controller();
$this -> load -> helper( 'url' );
}
function index()
{
$data = "";
$this -> _SetTpl( $data );
}
function _SetTpl( $data )
{
$this -> load -> library("scraping");
$data["scraping"]["text"] = $this-> scraping -> getWebText("http://www.example.com/");
$data["scraping"]["html"] = $this-> scraping -> getWebHtml("http://www.example.com/");
$data["scraping"]["link"] = $this-> scraping -> getWebLinksText("http://www.example.com/","\n");
$tpl["page_title"] = "Welcome";
$tpl["main_content"] = $this -> load -> view( 'tasklist_view', $data , true );
$this -> load -> view( 'base_view', $tpl );
}
}
我有一个视图,application / view / base_view.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta name="keywords" content="keyword here" />
<meta name="description" content="description here" />
<title><?php if(isset($page_title)){echo $page_title ;}?></title>
<?php if(isset($xajax_js)){echo $xajax_js ;}?>
<link href="http://127.0.0.1/ci_day4/css/mystyle.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="container">
<div id="rightblock">
<div id="content">
<?=$main_content?>
</div>
</div>
</div>
</body>
</html>
答案 0 :(得分:16)
Q1。您可以使用:
$this->load->library('snoopy');
在您的控制器中。并创建一个像这样的新实例:
$snooper = new Snoopy();
他们使用的原因:
if (!class_exists('Snoopy')) {
require_once(APPPATH.'libraries/Snoopy'.EXT);
}
因为如果您尝试使用$ this-&gt; load-&gt; library()会导致致命错误,因为库中没有加载程序类。你可以在一个控制器中调用它是因为你的控制器扩展了控制器类,它扩展了ci_base类,扩展了ci_loader类,这就是像$ this-&gt; load这样的调用功能来自的地方。你在这里展示的Scraping课没有。如果你深入挖掘,你会发现加载器基本上是使用include_once来包含你想要使用的任何类,助手等。
Q2。
$to_specialchars = true
正在将一对函数声明用作参数。设置'= true'只是设置默认值,所以你可以这样做:
echo $scrappy->getWebHtml('http://example.com');
与此相同:
echo $scrappy->getWebHtml('http://example.com', true);
如果查看该函数的return语句,你会看到它们是$ to_specialchars正在被检查,如果是,那么输出首先通过PHP函数htmlspecialchars()运行。
Q3。如果你看一下codeigniter项目的根,在index.php中你会看到EXT定义为:
define('EXT', '.'.pathinfo(__FILE__, PATHINFO_EXTENSION));
和APPATH:
if (is_dir($application_folder))
{
define('APPPATH', $application_folder.'/');
}
else
{
if ($application_folder == '')
{
$application_folder = 'application';
}
define('APPPATH', BASEPATH.$application_folder.'/');
}
因此这些是在引导时设置的两个常量,因此您可以在应用程序中使用它们,如果您要更改它们,那么它就不会像您在所提供的代码中看到的那样使用它们。
请下次每个stackoverflow问题有一个问题:)
答案 1 :(得分:0)
。此示例Scraping代码是基于使用库编写的: “史努比 - PHP网络客户端(snoopy.sourceforge.net)”
<小时/> 我试着再发一次。但我无法发布超链接。抱歉.. 我会在我的网站上回答这个问题。(我是新手stackoverflow.com :-()
我想我会在几天后尝试重新发布这些答案。