PHP 长文本中搜索,PHP在文本文件中搜索并回显整行

使用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会回答细节,因此请坚持使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值