2013-07-03 64 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