Следующие коды из http://d.hatena.ne.jp/dix3/20081002/1222899116 и коды работают хорошо.
Это пример использования snoopy в codeigniter.
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 должен быть расширением, но можно ли использовать его где угодно?
Заранее спасибо.
У меня есть snoopy в приложении / library / Snoopy.php
У меня есть приложение / библиотека / 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 */ ?>
У меня есть приложение-контроллер / контроллер / 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>
Q1. Вы можете использовать:
$this->load->library('snoopy');
В контроллерах. И создайте новый экземпляр так:
$snooper = new Snoopy();
Причина, по которой они используют:
if (!class_exists('Snoopy')) { require_once(APPPATH.'libraries/Snoopy'.EXT); }
Это потому, что вы получите фатальную ошибку, если попытаетесь использовать $ this-> load-> library (), поскольку класс загрузчика недоступен в библиотеке. Вы можете вызвать его в контроллере, потому что ваши контроллеры расширяют класс контроллера, который расширяет класс ci_base, который расширяет класс ci_loader, в котором возникает функциональность для совершения вызовов, таких как $ this-> load. Класс Scraping, который вы здесь показали, не работает. Если вы выкапываете, вы увидите, что загрузчик в основном использует include_once для включения любого класса, помощника и т. Д., Которые вы пытаетесь использовать.
Q2.
$to_specialchars = true
используется в парах деклараций функций в качестве параметров. Установка его '= true' просто устанавливает значение по умолчанию, поэтому вы можете это сделать:
echo $scrappy->getWebHtml('http://example.com');
Что идентично этому:
echo $scrappy->getWebHtml('http://example.com', true);
Если вы посмотрите на оператор возврата этой функции, вы увидите, что они проверяются на $ 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 🙂
, Этот образец кода скремблирования был написан на основе использования библиотеки: «Snoopy – клиент сети PHP (snoopy.sourceforge.net)»
Я думаю, что через несколько дней я попытаюсь повторить эти ответы.