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.... Что неверно....

Заключительное приложение намного сложнее, чем это... После того, как он найдет номер строки, он должен заменить строку, что-то еще, и сохранить изменения в файле, а затем продолжить обработку....

Заранее спасибо:)

Ответ 1

Ультра-базовое решение может быть:

$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;

Ответ 2

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", "[email protected]"); //return some number or false case not found.

Ответ 3

Если вам нужно быстрое и универсальное решение, которое работает также для поиска номера строки многострочного текста в файле, используйте это:

$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 +.

Ответ 4

$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])));
}

Ответ 5

Может быть, какой-нибудь прохожий или искатель хотят использовать это заранее script: php-grep