Используя php, я пытаюсь создать скрипт, который будет искать в текстовом файле и захватить всю эту строку и повторить ее.
У меня есть текстовый файл (.txt) под названием «numorder.txt», и в этом текстовом файле имеется несколько строк данных, причем новые строки появляются каждые 5 минут (с использованием задания cron). Данные выглядят примерно так:
2 aullah1 7 name 12 username
Как мне приступить к созданию php-скрипта, который будет искать данные «aullah1», а затем захватить всю строку и повторить ее? (После эхо, он должен отображать «2 aullah1» (без кавычек).
Если я не объясню ничего ясно и / или вы хотите, чтобы я объяснил более подробно, прокомментируйте.
И пример PHP, будут показаны несколько совпадающих строк:
<?php $file = 'somefile.txt'; $searchfor = 'name'; // the following line prevents the browser from parsing this as HTML. header('Content-Type: text/plain'); // get the file contents, assuming the file to be readable (and exist) $contents = file_get_contents($file); // escape special characters in the query $pattern = preg_quote($searchfor, '/'); // finalise the regular expression, matching the whole line $pattern = "/^.*$pattern.*\$/m"; // search, and store all matching occurences in $matches if(preg_match_all($pattern, $contents, $matches)){ echo "Found matches:\n"; echo implode("\n", $matches[0]); } else{ echo "No matches found"; }
Делай это так. Этот подход позволяет вам искать файл любого размера (большой размер не приведет к сбою сценария) и вернет ВСЕ строки, соответствующие нужной строке.
<?php $searchthis = "mystring"; $matches = array(); $handle = @fopen("path/to/inputfile.txt", "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle); if(strpos($buffer, $searchthis) !== FALSE) $matches[] = $buffer; } fclose($handle); } //show results: print_r($matches); ?>
Обратите внимание, как strpos
используется с !==
operator.
Использование file()
и strpos()
:
<?php // What to look for $search = 'foo'; // Read from file $lines = file('file.txt'); foreach($lines as $line) { // Check if the line contains the string we're looking for, and print if it does if(strpos($line, $search) !== false) echo $line; }
При тестировании в этом файле:
foozah
barzah
abczah
Он выводит:
foozah
Обновить:
Чтобы показать текст, если текст не найден, используйте что-то вроде этого:
<?php $search = 'foo'; $lines = file('file.txt'); // Store true when the text is found $found = false; foreach($lines as $line) { if(strpos($line, $search) !== false) { $found = true; echo $line; } } // If the text was not found, show a message if(!$found) { echo 'No match found'; }
Здесь я использую переменную $found
чтобы узнать, найдено ли совпадение.
похоже, что вам лучше систематизировать system("grep \"$QUERY\"")
так как этот скрипт не будет особенно высокой производительности в любом случае. В противном случае http://php.net/manual/en/function.file.php показывает, как перебирать строки, и вы можете использовать http://php.net/manual/en/function.strstr.php для поиска совпадений.
в одну сторону…
$needle = "blah"; $content = file_get_contents('file.txt'); preg_match('~^(.*'.$needle.'.*)$~',$content,$line); echo $line[1];
хотя, вероятно, было бы лучше прочитать его по строкам с помощью fopen () и fread () и использовать strpos ()
<?php // script.php $searchfor = $_GET['keyword']; $file = 'users.txt'; $contents = file_get_contents($file); $pattern = preg_quote($searchfor, '/'); $pattern = "/^.*$pattern.*\$/m"; if(preg_match_all($pattern, $contents, $matches)){ echo "Found matches:<br />"; echo implode("<br />", $matches[0]); } else{ echo "No matches found"; fclose ($file); } ?>