У меня есть приложение, которое должно открыть файл, затем найти в нем строку и напечатать номер строки, где находится строка.
Например, файл 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 …. Что не так ….
Заключительное приложение намного сложнее, чем это … После того, как он нашел номер строки, он должен заменить строку, которая что-то еще, и сохранить изменения в файле, затем идет дальнейшая обработка ….
Заранее спасибо 🙂
Ультра-базовое решение может быть:
$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;
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.
Если вам нужно быстрое и универсальное решение, которое также работает для поиска номера строки многострочного текста в файле, используйте это:
$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+.
$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]))); }
Возможно, какой-нибудь прохожий или искатель хотят использовать этот готовый скрипт: php-grep