php endsWith函数在一台服务器上失败但在另一台服务器上工作?

时间:2015-02-18 16:05:03

标签: php server explode ends-with

我有一个脚本,它本质上是一个索引新闻文章的爬虫。该脚本在一台服务器(主http服务器)上运行正常,但我试图将其移动到专用平台,一个部分将无法运行。

失败的部分使用一个简单的函数(来自SO)来检查字符串(爬虫找到的URL)是否与本地存储在.txt文件中的排除列表相匹配。

我已经测试过确保使用var_dump接收.txt文件,一切都显示正常。

这一直无法取消设置或回显肯定,但在另一台服务器上一切正常。

重要的部分如下:

<?php
ini_set('display_errors', 1);
$linkurl_reg = '/href="http:\/\/metro.co.uk(.+?)"/is';    


function endsWith($haystack, $needle)
{
return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
}

$data = file_get_contents("http://metro.co.uk");
preg_match_all($linkurl_reg,$data,$new_links);

$exclusion_list = explode("\n",file_get_contents('../F/exclusion_list.txt'));

var_dump($exclusion_list); //just to check we got the file ok

for($i = '0';$i < count($new_links[1]) ; $i++){
        for ($ii = '0';$ii < count($exclusion_list);$ii++){
        if(endsWith($new_links[1][$i], $exclusion_list[$ii])){echo 'unset ';unset($new_links[1][$i]);}else{echo'not unset ';}
        }
    }


?> 

奇怪的是,如果我在设置排除列表时只使用单个值,例如

$exclusion_list[0] = "xmlrpc.php"; 

而不是

$exclusion_list = explode("\n",file_get_contents('../F/exclusion_list.txt'));

它适用于该特定字符串。

如果有人有任何问题,我现在已经盯着这3天了,我完全被难过了。

我尝试过的事情:

在爆炸前将$ exclusion_list数组编码为UTF。

在循环中将$ exclusion_list字符串编码为UTF

使用普通字符串测试函数

手动编写字符串而不是从数组或文件中编写(烦人地工作)

将.exxt中的fileextension更改为各种其他内容

更新服务器上的php版本(非工作版)

在爆炸期间将“\ n”替换为“\ n”和“\ n \ r”

我甚至尝试将功能更改为在SO上找到的其他功能,奇怪的是我得到相同的结果(使用我定义的字符串,但不包含从exclusion_list文件中检索到的任何内容)。

对于我的生活,我不知道为什么一个人会工作,而不是另一个。

当前PHP版本:5.4.36-0 + deb7u3(非工作服务器)

当前PHP版本:5.2.17(工作服务器)

请求var_dump for $ exclusion list(非工作服务器):

array(9) {
  [0]=>
  string(6) ".jpeg"
  [1]=>
  string(5) ".jpg"
  [2]=>
   string(5) ".gif"
  [3]=>
  string(5) ".css"
  [4]=>
  string(5) ".xml"
  [5]=>
  string(11) "xmlrpc.php"
  [6]=>
  string(21) "metro.co.uk" target="
  [7]=>
  string(20) "metro.co.uk/osd.xml"
  [8]=>
  string(32) "metro.co.uk/terms/#privacypolicy"
}

请求var_dump for $ exclusion list(工作服务器):

array(9) {
  [0]=>
  string(5) ".jpeg"
  [1]=>
  string(4) ".jpg"
  [2]=>
  string(4) ".gif"
  [3]=>
  string(4) ".css"
  [4]=>
  string(4) ".xml"
  [5]=>
  string(10) "xmlrpc.php"
  [6]=>
  string(20) "metro.co.uk" target="
  [7]=>
  string(19) "metro.co.uk/osd.xml"
  [8]=>
  string(32) "metro.co.uk/terms/#privacypolicy"
}

两个服务器都是linux,两个文本文件都不是在Windows平台上构建或编辑的

3 个答案:

答案 0 :(得分:1)

确保* .txt文件中的行由\ n而不是\ r \ n分隔,如果您保存在Windows程序中,则会发生这种情况。

否则在用&#39; \ n&#39;字符串将全部以&#39; \ r&#39;结尾。因此可能没有满足endsWith()条件

此代码应适用于两台计算机:

$exclusion_list = explode("\n",str_replace("\r", "", file_get_contents('../F/exclusion_list.txt')));

答案 1 :(得分:0)

如果您的某台服务器或计算机正在使用Windows,则可能是行结束编码存在问题:Windows上为\ r \ n,而unix上为\ n(我认为\ r \ n在iOS上,但我&#39 ;我不确定)

答案 2 :(得分:0)

可能是文件中的一些问题,请尝试使用其他文件并检查它是否显示相同的问题。