2011-06-21 82 views
7

我得按以下格式的用戶名和電子郵件的大平面文件:PHP查找字符串文件

"username", "email" 
"username", "email" 
"username", "email" 

等等

我需要的電子郵件和搜索用戶名,但由於某種原因,它不會返回結果。如果我在對面搜索,它會有效。

$string = "[email protected]"; 
$filename = "user_email.txt"; 
     $h = fopen("$filename","r"); 
     $flag=0; 

     while (!feof ($h)) { 
      $buffer = fgets($h); 
      $thisarray = split(",", $buffer); 

      if ($string == str_replace('"','', $thisarray[1])) { 
       $i = 1; 
       $i++; 
       echo '<td bgcolor="#CCFFCC"><b style="color: maroon">' . str_replace('"','',$thisarray[0]). '</b></td>'; 

       } 

任何想法?謝謝!

+0

您可以使用'fgetcsv'從文件句柄中讀取CSV行:http://php.net/fgetcsv –

+0

[PHP讀取CSV和按日期過濾]的可能重複(http://stackoverflow.com/questions/2127775/php-read-csv-and-filter-by-date#2128053) – Gordon

回答

6

按照reko_t的建議:使用fgetcsv將csv的各行讀入數組,直到找到第二個元素與您的搜索詞匹配的行。第一個元素是用戶名。就像:

<?php 
function find_user($filename, $email) { 
    $f = fopen($filename, "r"); 
    $result = false; 
    while ($row = fgetcsv($f)) { 
     if ($row[1] == $email) { 
      $result = $row[0]; 
      break; 
     } 
    } 
    fclose($f); 
    return $result; 
} 
+0

工作完美!謝謝:) –

+0

感謝它對我的適當工作... – pratik

1

您可以使用fgetcsv()直接

$string = "[email protected]"; 
$filename = "user_email.txt"; 
$h = fopen("$filename","r"); 
$flag=0; 

while (!feof ($h)) { 
    list($username, $email= fgetcsv($h); 

    if ($string == $email) { /* do something */ } 
} 

fgetcsv()(作爲一個很好的副作用),同時刪除了對您的「域外殼」(雙引號"),如果他們存在。

你自己的例子大概是不行的,因爲如果你有這樣一行

"username", "email" 

,分裂將導致

'"username"' 
' "email"' 

公告空白"email"之前,你忘了刪除。額外使用str_replace()刪除周圍的報價是相當不安全的。看看trim()

+0

此外,如果您只需要直到找到電子郵件,然後停止,添加一個休息;聲明到if語句的結尾。 – Joseph

0

首先,只需使用文件()來獲取文件的內容到一個數組:

$file_contents = file($filename, 'r'); 

現在通過數組的內容,分割字符串和檢查電子郵件地址循環:

foreach ($file_contents as $line) { 
    list ($username, $email) = str_split(',' $line); 
    if (trim($email) == $string) { 
     // A match was found. Take appropriate action. 
    } 
} 
0

我認爲最簡單的解決方案是使用文件()與str_getcsv()。

的代碼將是這樣的:

foreach (file($fileName, FILE_SKIP_EMPTY_LINES) as $line) { 
    $columns = str_getcsv($line); // Where $columns[0] and $columns[1] hold the username and email respectively. 
} 
0

雖然fgetcsv可能是一個更優雅的解決方案,不回答你原來的問題:你的第二個數組元素有一個換行,你要比較對一個沒有的字符串。

要解決:

if ($string == str_replace('"','', chop($thisarray[1]))) { 
0

我真的相信,在其他的答案的所有示例工程!
但他們都是,因爲他們都遍歷csv文件中的每一行...
我還有一個例子,如何找到所需的字符串:

$command = sprintf("grep '%s,%s' -Er %s", $userName, $email, $file); 
$result = `$command`; 

是它某種暗物質,但它確實有效,它真的快速