2012-06-22 40 views
1

我有一個包含域和IPS看起來像這樣比較,從文件中讀取PHP領域

aaa.bbb.com 8.8.8.8
bbb.com 2.2.2.2
...
一個txt文件 ...
..

如何更換bbb.com到3.3.3.3,但不改變aaa.bbb.com?

這是我的功能的一部分,但根本不工作。

我從文件
閱讀它一行行,我得到了匹配的記錄後,搜索匹配域第一部分,將其刪除。
第二部分我寫了一個新的一行。

$filename = "record.txt"; 
    $lines = file($filename); 

    foreach($lines as $line) 
    if(!strstr($line, "bbb.com") //I think here is the problem core 
    $out .= $line; 

    $f = fopen($filename, "w"); 
    fwrite($f, $out); 
    fclose($f); 



    $myFile = "record.txt"; 
    $fh = fopen($myFile, 'a') or die("can't open file"); 
    $stringData = "bbb.com\n 3.3.3.3\n"; 
    fwrite($fh, $stringData); 
    fclose($fh); 

後,我執行我的代碼,都aaa.bbb.com和bbb.com被刪除了,我怎麼能解決這個問題呢?

我試過「parse_url」,但「parse_url」只用「http://」前綴而不是域解析url。

+0

如果你正在寫這樣的'$ StringData是= 「bbb.com \ n 3.3.3.3 \ n」 個數據;'這將有2個每條記錄都有一行:一個是域名,另一個是IP地址。那是對的嗎? –

+0

對不起,這應該是一個錯誤,它應該像「bbb.com \ t 3.3.3.3 \ n」選項卡而不是換行符 – tommyhsu

回答

1

好了,遺憾的誤解,這應該工作:

<?php 

$file = "record.txt"; 
$search = "bbb.com"; 
$replace = "3.3.3.3"; 

$open = file_get_contents($file); 
$lines = explode(PHP_EOL, $open); 
$dump = ""; 
foreach($lines as $line){ 
    $pos = strpos($line, $search); 
    if($pos === false){ 
    echo "<b>$line</b>"; 
     $dump .= $line.PHP_EOL; 
    }else{ 
     if($pos !== 0){ 
      $dump .= $line.PHP_EOL; 
     }else{ 
      $dump .= $search." ".$replace.PHP_EOL; 
     } 
    } 
} 
$dump = substr($dump,0,-1); 
file_put_contents($file, $dump); 

?> 
+0

不要忘記在文件的開始處添加一行,(因爲如果bbb.com在第一行不會被替換,因爲在它之前沒有\ r \ n!) – HamZa

+0

我試過這段代碼,但它將bbb.com替換爲3.3.3.3,這不是我需要的目的。我需要將「bbb.com 2.2.2.2」更改爲「bbb.com 3.3.3.3」,無論如何感謝您的幫助。 – tommyhsu

+0

那麼這裏的新代碼...試試吧:) – HamZa

0

我能想到的最簡單的解決方案是使用substr($line,0,7) == 'bbb.com'而不是您的strstr比較。

+0

,但結果與strstr沒什麼不同,謝謝幫助 – tommyhsu

+0

必須有另一個錯誤。 substr做的是在字符串的開頭測試bbb.com - 所以aaa.bbb.com不能匹配!啊,你需要根據你的實際需要調整==;如果我正確讀取了你的代碼,它應該是!=。 –