过滤掉txt文件中的特定字符串

时间:2015-05-04 08:38:58

标签: php arrays file foreach

我有这个搜索脚本:

    $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>

4 个答案:

答案 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中的标准正则表达式方言。