PHP для поиска в txt файле и эхо всей строки
Используя php, я пытаюсь создать script, который будет искать в текстовом файле и захватывать всю эту строку и эхо его.
У меня есть текстовый файл (.txt) под названием "numorder.txt", и в этом текстовом файле имеется несколько строк данных, причем новые строки появляются каждые 5 минут (с использованием задания cron). Данные выглядят примерно так:
2 aullah1
7 name
12 username
Как мне приступить к созданию php script, который будет искать данные "aullah1", а затем захватить всю строку и повторить ее? (После эхо-сигнала он должен отображать "2 aullah1" (без кавычек).
Если я ничего не объяснил и/или вы бы мне более подробно объяснили, прокомментируйте.
Ответы
Ответ 1
И пример 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";
}
Ответ 2
Сделайте это так. Этот подход позволяет вам искать файл любого размера (большой размер не приведет к сбою script) и вернет ВСЕ строки, которые соответствуют нужной строке. p >
<?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
используется с оператором !==
.
Ответ 3
Используя 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
Update:
Чтобы показать текст, если текст не найден, используйте что-то вроде этого:
<?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
, чтобы узнать, найдено ли совпадение.
Ответ 4
похоже, что вам лучше отключиться до system("grep \"$QUERY\"")
, так как script не будет особенно высокой производительности в любом случае. В противном случае http://php.net/manual/en/function.file.php показывает вам, как перебирать строки, и вы можете использовать http://php.net/manual/en/function.strstr.php для поиска совпадений.
Ответ 5
в одну сторону...
$needle = "blah";
$content = file_get_contents('file.txt');
preg_match('~^(.*'.$needle.'.*)$~',$content,$line);
echo $line[1];
хотя, вероятно, было бы лучше прочитать его по строкам с помощью fopen() и fread() и использовать strpos()
Ответ 6
<?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);
}
?>