2013-07-03 19 views
0

我有一个PHP脚本,包括特殊的查阅情况不同的网页:PHP爆炸工作只与最后一行

$ref_found = false; 

// get referer if exists 
$referer = false; 
if (isset($_SERVER['HTTP_REFERER'])) { 
    $referer = $_SERVER['HTTP_REFERER']; 
    // get content of list.txt 
    $list = explode(chr(10), file_get_contents('list.txt')); 
    foreach ($list as $l) { 
     if (strlen($l) > 0) { 
      if (strpos($referer, $l)) { 
       $ref_found = true; 
      } 
     } 
    } 
} 

// include the correct file 
if ($ref_found) { 
    require_once('special_page.html'); 
} else { 
    require_once('regular_page.html'); 
} 

的Referer DB是简单的txt文件(LIST.TXT),它看起来像这样:

domain1.com

domain2.com

domain3.com

不幸的是,此脚本仅适用于列表中的最后一个域(domain3.com)。

我添加了什么? \n
或者以不同的方式创建域DB更好?

回答

2

问题是,当你explode()你的域名列表,你最终每个项目周围的空白。至少,你会在某个地方换一个换行符(\n),因为文件中的换行符可能是\r\n

所以你正在检查诸如" domain1.com""\ndomain1.com""domain1.com\n"。由于这个额外的空格在引用标头中不存在,所以在您期望的时候它不匹配。

通过对找到的每个值调用trim(),你会得到你可以用来做更有用比较干净的域名:

我做了几个其他的小更新您的代码好:

  1. 我使用chr()切离,只是用一个字符串("\n")。只要你使用双引号,它将是一个字面上的换行符,而不是实际的\n,字符串文字对于读取你的代码的人来说更容易理解。

  2. 我从"\r"字符(字符10)切换到"\n"字符(字符13)。有几种不同的换行格式,但最常见的是"\n""\r\n"。通过在"\n"上爆炸,您的代码将同时适用于两种格式,其中"\r"仅适用于第二种格式。

  3. 我组合了你的两个if陈述。这是一个非常小的更新,除了(在我看来)使代码更易于阅读之外,没有太大影响。

  4. 我更新了您的strpos(),将其与false进行了文字比较(!==)。这可能不是这个代码的问题,因为referrer的值将以http://开头,但这是一个很好的习惯。如果子字符串恰好发生在父字符串的开始处,则strpos()将返回0,在您的原始代码中将被解释为false。

  5. 如果您发现匹配的域名,我在循环中添加了break声明。一旦找到并设置了标志,就没有理由继续检查列表中的其他域,并且break允许您取消其余的foreach循环。

+0

这是工作,非常感谢你很多帮助:) – Luca

+0

@ user2545134如果您发现此回答有用,您可以点击旁边的复选标记将其标记为已接受的答案。一旦你有更多的代表,你也可以upvote任何有用的答案。 – jcsanyi

+0

完成, “break”非常棒,我可以在列表开头设置最受欢迎的域名以加速 – Luca

0
chr(13) == "\n" 
chr(10) == "\r" 

"\n"很可能是你想要的。

+0

它适用于只是“\ n” – DevZer0

+0

我知道'\ N'是不必引用ASCII表:) – Orangepill

+1

OPS问题是OP只使用\ R, – DevZer0