web-dev-qa-db-ja.com

PHP-ファイル内の文字列を検索し、その行番号を表示します

ファイルを開いてその中の文字列を見つけ、文字列が見つかった行番号を出力する必要があるアプリケーションがあります。

たとえば、ファイルexample.txtにはいくつかのハッシュが含まれています。

APLF2J51 1a79a4d60de6718e8e5b326e338ae533
EEQJE2YX 66b375b08fc869632935c9e6a9c7f8da O87IGF8R
c458fb5edb84c54f4dc42804622aa0c5 APLF2J51
B7TSW1ZE 1e9eea56686511e9052e6578b56ae018
EEQJE2YX affb23b07576b88d1e9fea50719fb3b7


したがって、PHP "1e9eea56686511e9052e6578b56ae018"を検索し、その行番号を出力します(この場合は4)。

ファイルには複数のハッシュが含まれないことに注意してください。

インターネットでいくつかのコードを見つけましたが、何も機能しないようです。

私はこれを試しました:

<?PHP
$string = "1e9eea56686511e9052e6578b56ae018"; 
$data   = file_get_contents("example.txt"); 
$data   = explode("\n", $data); 
for ($line = 0; $line < count($data); $line++) { 
if (strpos($data[$line], $string) >= 0) { 
die("String $string found at line number: $line"); 
} 
} 
?>

文字列が行0で見つかったというだけです。

最終的なアプリケーションはそれよりもはるかに複雑です...行番号が見つかったら、文字列を何か他のものに置き換え、変更をファイルに保存してから、さらに処理を進めます。

前もって感謝します :)

15
xZero

超基本的な解決策は:

$search      = "1e9eea56686511e9052e6578b56ae018";
$lines       = file('example.txt');
$line_number = false;

while (list($key, $line) = each($lines) and !$line_number) {
   $line_number = (strpos($line, $search) !== FALSE) ? $key + 1 : $line_number;
}

echo $line_number;

大きなファイル用のメモリセーバーバージョン:

$search      = "1e9eea56686511e9052e6578b56ae018";
$line_number = false;

if ($handle = fopen("example.txt", "r")) {
   $count = 0;
   while (($line = fgets($handle, 4096)) !== FALSE and !$line_number) {
      $count++;
      $line_number = (strpos($line, $search) !== FALSE) ? $count : $line_number;
   }
   fclose($handle);
}

echo $line_number;
16
Edakos
function get_line_from_hashes($file, $find){
    $file_content = file_get_contents($file);
    $lines = explode("\n", $file_content);

    foreach($lines as $num => $line){
        $pos = strpos($line, $find);
        if($pos !== false)
            return $num + 1
    }
    return false
}

get_line_from_hashes("arquivo.txt", "asdsadas2e3xe3ceQ@E"); //return some number or false case not found.
2

ファイル内の複数行テキストの行番号を見つけるためにも機能する高速で普遍的なソリューションが必要な場合は、これを使用してください

$file_content = file_get_contents('example.txt');

$content_before_string = strstr($file_content, $string, true);

if (false !== $content_before_string) {
    $line = count(explode(PHP_EOL, $content_before_string));
    die("String $string found at line number: $line");
}

[〜#〜] fyi [〜#〜]PHP 5.3.0 +。

2
$pattern = '/1e9eea56686511e9052e6578b56ae018/';
if (preg_match($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) {
    //PREG_OFFSET_CAPTURE will add offset of the found string to the array of matches
    //now get a substring of the offset length and explode it by \n
    $lineNumber = count(explode("\n", substr($content, 0, $matches[0][1])));
}
0
Eugene Tulika