PHP:file_get_contents和cURL给出404,因为" myterious"越线

时间:2015-02-05 06:56:19

标签: php phpquery

我正在使用PhpQuery获取与特定类的所有链接,之后我想让每个链接的html源变得混乱。

但首先是我从我正在研究的网站上获取链接。我没有我正在使用的网站的任何管理员权限。

所以,为了在我的localhost环境中完成我的所有研究,我完成了从这样的事情改变所有链接:

<a class="linkHtml" href="search?q=HUGE_QUERY_HERE">link</a>

为:

<a class="linkHtml" href="http://www.domain.com/search?q=HUGE_QUERY_HERE">link</a>

在这里使用这个PHP代码:

foreach (pq('.linkHtml') as $link) {                
    $id = pq($link)->parent()->prev()->text();              
    $search = 'search?q=';
    $replace = 'http://www.domain.com/busca/search?q=';
    $subject = pq($link)->attr('href'); 
    $pageUrl =str_replace($search,$replace,$subject);               

    pq($link)->attr('href',$pageUrl);                   

   /* more code here */
}

问题是第一个?以某种方式打破了字符串。我甚至无法在文本中重现同样的错误,我必须上传它的图片。

考虑到上面的代码,如果我执行var_dump($pageUrl)并尝试连接,则会产生以下结果:

你可以看到它在search?之后看起来有一个换行符,即使它很难做到也很难。我已经尝试根据this答案和其他人删除所有换行符并且没有运气。并尝试连接,就好像网址以问号结束一样。

如果我将代码更改为:

$pageUrl =str_replace("search?q=", "searchq=", $pageUrl);       
var_dump($pageUrl);     

会导致:

正如您所看到的,它会尝试正确连接,但显然searchq=是错误的。

我错过了什么?断线来自哪里? 我说我不能在文本中重现它,因为如果我复制它,它看起来很正常,因为那里什么也没有,网站将正常工作。

修改 也试了这个没有运气。

$pageUrl = urlencode($pageUrl);
$pageUrl = str_replace("%2f","/",$pageUrl); 
$pageUrl = str_replace("%3A",":",$pageUrl); 
$content = file_get_contents($pageUrl);

将字符串更改为单引号后,每个字符串var_dump会产生以下结果:

enter image description here

抱歉使用所有这些图片,但我不知道更好的方法来重现完全相同的问题。也很抱歉总是隐藏网站域使图像变脏,但我必须。

1 个答案:

答案 0 :(得分:0)

我假设你有一些打破你的网址的突破线, 尝试这样做:

$findStringsArr = array("\0","\n","\r","search?q=");
$replaceStringsWithArr = array("","","","http://www.domain.com/busca/search?q=");
$subject = pq($link)->attr('href'); 
$pageUrl = str_replace($findStringsArr,$replaceStringsWithArr,$subject);