我有这个搜索脚本:
$search = $_GET["search"];
$logfile = $_GET['logfile'];
$file = fopen($logfile, "r");
?>
<head>
<title>Searching: <?php echo $search ?></title>
</head>
<?php
while( ($line = fgets($file) )!= false) {
if(stristr($line,$search)) {
// case insensitive
echo "<font face='Arial'> $line </font><hr><p>";
}
}
我想在搜索txt文件中的内容时过滤掉特定的字符串。
例如,文本文件由以下内容组成:
http://test.com/?id=2022458&pid=41&user=Ser_Manji
Ser_manji said "hello"
Ser_manju left the game
当您搜索&#34; Ser_manji&#34;的实例时,我想过滤掉这个字符串:
http://test.com/?id=2022458&pid=41&user=Ser_Manji
但仍显示以下两行:
Ser_manji said "hello"
Ser_manju left the game
我希望这是可能的,我自己试图改变它,因此它不会接受任何与包含&#34; test.com&#34;的行相关的事情,但这不起作用。< / p>
答案 0 :(得分:1)
这应该适合你:
只需将您的文件放入包含file()
的数组即可。并使用strpos()
检查搜索针是否在行中,如果没有显示该行。
<?php
$search = $_GET["search"];
$logfile = $_GET['logfile'];
$lines = file($logfile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
?>
<head>
<title>Searching: <?php echo $search ?></title>
</head>
<?php
foreach($lines as $line) {
if(strpos($line, $search) === FALSE) {
echo "<font face='Arial'>$line</font><hr><p>";
}
}
?>
答案 1 :(得分:0)
您只需修改if条件:
if (stristr($line, $search) && strpos($line,'test.com') === false)
答案 2 :(得分:0)
我想你需要根据特定的用户名过滤掉日志。这似乎比找到合适的php函数更复杂。
所以你得到了你的搜索q:$search = $_GET['search']
这是一个用户名。
您收到了日志文件:$file = fopen($logfile, 'r')
。
请注意:您使用GET参数获取文件名,但示例链接http://test.com/?id=2022458&pid=41&user=Ser_Manji
不包含任何&logfile=logs.txt
。我想你知道你在做什么。
现在,如果您的日志结构是{username} {action},那么我们知道&#34; space&#34;从他的行动中分割用户名。我们可以使用爆炸:$clues = explode(' ', $line);
,现在$username = $clues[0]
和$action = clues[1]
。
所以if ($username == $search) echo $action
保持简洁。
$search = $_GET["search"];
$logfile = $_GET['logfile'];
$file = fopen($logfile, "r");
while ($line = fgets($logfile)) {
$clues = explode(' ', $line);
$username = $clues[0];
$action = $clues[1];
if ($username == $search) {
echo $action;
}
}
如果您要在logs.txt文件中查找user_1234,那么您应该通过以下方式测试:http://test.com?search=user_1234&logfile=logs.txt
。
答案 3 :(得分:0)
如果要仅在行的开头匹配文本(不区分大小写),可以考虑使用不区分大小写的anchored正则表达式,以便在理想情况下使用preg_grep
过滤文本文件数组上的函数(例如通过file
)或 SplFileObject 上的 FilterIterator 。
$result = preg_grep($pattern, file($logfile));
foreach ($result as $line) {
... // $line is each grep'ed (found) line
}
对于数组变体:
$file = new SplFileObject($logfile);
$filter = new RegexIterator($file, $pattern);
foreach ($filter as $line) {
... // $line is each filtered (found) line
}
使用迭代器时,它略有不同:
{{1}}
迭代器为您提供了一种更面向对象的方法,阵列感觉可能更直接。这两个变体都使用PHP中的PCRE正则表达式,这是PHP中的标准正则表达式方言。