使用php,我正在尝试创建一个脚本,该脚本将在文本文件中搜索并获取整行并将其回显。
我有一个名为" numorder.txt"的文本文件(.txt),并且在该文本文件中有几行数据,每5分钟会有新行出现(使用cron作业)。 数据类似于:
2 aullah1
7 name
12 username
我将如何创建一个php脚本,该脚本将搜索数据" aullah1",然后获取整行并回显它? (一旦回显,它应该显示" 2 aullah1"(不带引号)。
如果我没有清楚地解释任何事情和/或您想让我更详细地解释,请发表评论。
"每5分钟就会有新行出现" –听起来像很多数据。 也许您应该重新考虑您在做什么,并使用一些数据库来存储值。 否则,随着文件大小的增加,php将会出现大问题。
嘿戳,谢谢您的答复和关注。 ;)文件不会真的太大,实际上我认为目前只有大约150行。 尽管它每5分钟更新一次,但一次只能是1行或最多20行。 在某些情况下,我可能会删除这些行以重置数据。 我提到行更新的唯一原因是,以便在文本文件中搜索时,我不会得到基于行的答案。 再次,我非常感谢您的回复,并感谢您。 ;)
PHP脚本的重复可能会占据整个行
github.com/skfaisal93/AnyWhereInFiles
还有一个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:
";
echo implode("
", $matches[0]);
}
else{
echo"No matches found";
}
您是说preg_match_all吗?
是的,我确实做到了,我习惯于使用JS g标志:使用一个功能:o
您好Lekensteyn,我非常感谢您的回复,并喜欢您的编码。我很喜欢使用此脚本,但是,每当我替换$ searchfor变量中的文本" name"时,总是收到错误"找不到匹配项"。当然,那可能只是我。可能有很多问题导致这种情况,我会尝试找出原因,但您认为这可能是编码吗?再次致歉,如果我造成任何麻烦,我非常感谢您的回应和努力。谢谢。 ;)
添加了m标志并将implode("
", $matches)更改为implode("
", $matches[0])。经过测试,现在可以使用。再试一遍 :)
^*.不是有效的正则表达式...这不是错误,因此我已回退了该更改。
像这样做。这种方法使您可以搜索任何大小的文件(大文件不会使脚本崩溃),并将返回与所需字符串匹配的所有行。
$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与!==运算符一起使用的方式。
我唯一要吃的牛肉就是抑制错误。在我看来,最好在生产时关闭display_errors,但至少以这种方式,您可以看到任何错误并可以在开发过程中修复它们。 +1虽然是个不错的答案。
您好shamittomar,谢谢您的回复。非常感谢您和您的编码!谢谢。 ;)不过,我真的不喜欢如何在数组中显示结果的想法,因为最终需要将结果显示给最终用户。 :(当然,感谢您的回复以及您的编码。谢谢。
@AUllah。别客气。我刚刚打印了结果数组。由您决定以任何方式显示阵列。对$matches进行foreach循环,并根据您的样式和选择来回显结果。
@premiso,是的,我完全同意这种做法。但是,if($handle)可以具有else,说明文件未正确打开。我更喜欢这种方法。只是选择的问题。
是的,否则将很容易出现用户友好的错误。但是在开发过程中也有实际错误也很好。
如果您使用的fgets()没有长度(第二个参数),则由于内存限制,脚本可能仍会停止。这是因为fgets()读取一行。但是,如果您有一个二进制文件(或一个非常长的文本文件),则该函数可能会读取到文件末尾!它不能保证您读取整个文件。只需添加一个长度,e。 G。 262144(256 KiB)。
使用file()和strpos():
// 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
更新:
要显示文本(如果找不到该文本),请使用如下所示的内容:
$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变量来查找是否找到匹配项。
嗨,Frxstrem,谢谢您的回复。我非常喜欢它,感谢您的回复。该代码似乎运行良好,如果您认为可能的话,可以对" if"添加" else"行。线路上是否有"找不到"的内容?同样,如果林先生要求的太多,就这样道歉,也很好。非常感谢您的回复,也非常感谢! ;)
@ AUllah1:这很容易做到,所以我用这个更新了我的答案
看起来您最好将系统移植到system("grep \"$QUERY\""),因为该脚本在两种情况下都不会具有特别高的性能。否则,http://php.net/manual/en/function.file.php会向您显示如何循环显示行,您可以使用http://php.net/manual/en/function.strstr.php查找匹配项。
嗨,诺维科夫,谢谢您的回应,我非常感谢您以及您的努力。我会尝试从您提供的链接中找出正面和反面的方法。 ;)我不能使用系统方法的原因是,我最终会将脚本转换为搜索。当然,我没有对此表示歉意。我的错。抱歉,谢谢您的回复。 ;)
您真的不想在不使用escapeshellarg()的情况下将任何东西传递给system(),shell_exec(),exec()等...这通常会带来很大的安全问题:-)
// 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:
";
echo implode("
", $matches[0]);
}
else{
echo"No matches found";
fclose ($file);
}
?>
为这个5年的老问题提供这个全新的东西吗?
^.*$pattern.*\$表达式与$pattern相同
现在它以某种方式帮助了我。
单程...
$needle ="blah";
$content = file_get_contents('file.txt');
preg_match('~^(.*'.$needle.'.*)$~',$content,$line);
echo $line[1];
尽管最好用fopen()和fread()逐行读取并使用strpos()可能会更好
您好蜡笔暴力,谢谢您的回复。非常感谢,但是,每当我尝试运行此代码时,我总是在浏览器中看到一个空白页。我目前正在运行PHP 5.3.2,如果问题出在哪里?再次感谢您的回应和努力。谢谢! ;)
可能有很多事情,例如错误的路径/到/文件等。cant确实可以帮助您了解自己实际使用的方法..但是类似的事情实际上仅对短文件有用。总体而言,正如我提到的那样,最好逐行阅读,shamittomars会回答细节,因此请坚持使用。