simple_html_dom忽略特殊字符

时间:2014-09-01 15:29:53

标签: php url special-characters file-get-contents encode

我正在使用的代码是下面的代码,这个代码完全正常,直到我遇到带有日文字符或任何特殊字符的网址。我观察到了这个问题,似乎每当网址包含日语这样的特殊字符时,它只会返回域名,因此我不断得到我不打算检索的随机结果。

  include_once 'simple_html_dom.php';
header('Content-Type: text/html; charset=utf-8');

$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';

$html = file_get_html($url_link);
echo $html->find('.bigChar', 0)->innertext;

我应该得到" Ramune骑士"因为那是我试图检索的元素。相反,$ url_link被重定向到域名,即' http://kissanime.com/'没有'动漫/骑士骑士VS骑士ラムネ&40FRESH'。从那里开始,它会查找具有' .bigChar'的值的类。给出随机值的结果。

1 个答案:

答案 0 :(得分:0)

真实问题域是如何使用带有UTF-8字符的网址检索数据,而不是simple_html_dom

首先,我们需要对字符进行编码:

$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';

$strPosLastPart  = strrpos($url_link, '/') + 1;
$lastPart        = substr($url_link, $strPosLastPart);
$encodedLastPart = rawurlencode($lastPart);
$url_link        = str_replace($lastPart, $encodedLastPart, $url_link);

Normaly这应该有效。既然我已经测试过了,那就不行了。所以我问为什么会发生这个错误,并使用CURL进行调用。

  

对象引用未设置为对象的实例。描述:一个   在执行当前Web期间发生了未处理的异常   请求。请查看堆栈跟踪以获取有关的更多信息   错误以及它在代码中的起源。

     

异常详细信息:System.NullReferenceException:不是对象引用   设置为对象的实例。

现在我们知道,这个页面是用ASP.NET编写的。但我问我,为什么它不起作用。我添加了一个用户代理,瞧:

$ch = curl_init($url_link);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
$data = curl_exec($ch);
echo $data;

所有在一起(工作):

$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';

//Encode Characters
$strPosLastPart  = strrpos($url_link, '/') + 1;
$lastPart        = substr($url_link, $strPosLastPart);
$encodedLastPart = rawurlencode($lastPart);
$url_link        = str_replace($lastPart, $encodedLastPart, $url_link);

//Download Data
$ch = curl_init($url_link);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
$data = curl_exec($ch);

//Load Data into Html (untested, since i am not using this Lib)
$html = str_get_html($data);

现在的不同之处在于,将$data读入您的simple_html_dom.php课程,而不是file_get_html

干杯