2

我有一个 php 程序,它查看日志文件并将其打印到页面(下面的代码)。我不希望所述网站的用户能够查看任何包含/. 我知道我可以使用 trim 删除某些字符,但是有没有办法删除整行?例如,我想保留“Hello”之类的内容并删除/xx.xx.xx.xx connected. 我希望删除的所有行都具有相同的公共键,/. 所述日志文件中的人名<>周围有 s,所以我必须使用htmlspecialcharacters

$file = file_get_contents('/path/to/log', true);
$file = htmlspecialchars($file);
echo nl2br($file);

谢谢你的帮助!

编辑:感谢所有答案,目前正在修补它们!

EDIT2:最终代码:

<?php
$file = file_get_contents('/path/to/log', true);
// Separate by line
$lines = explode(PHP_EOL, $file);

foreach ($lines as $line) {
    if (strpos($line, '/') === false) {
        $line = htmlspecialchars($line . "\n");
        echo nl2br($line);
    }
}
?>
4

4 回答 4

3

你的意思是,像这样?

$file = file_get_contents('/path/to/log', true);

// Separate by line
$lines = explode(PHP_EOL, $file);

foreach ($lines as $line) {
    if (strpos($line, '/') === false) {
        // If the line doesn't contain a "/", echo it
        echo $line . PHP_EOL;
    }
}

对于任何想知道的人,PHP_EOL是“行尾”的PHP常量,并促进不同系统(Windows、UNIX 等)之间的一致性。

于 2013-08-04T19:39:30.940 回答
0

使用str_replace功能 - http://php.net/manual/en/function.str-replace.php。替代解决方案(在转义特殊字符之前) -

/* pattern /\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\sconnected/ = /xx.xx.xx.xx connected */
/* pattern will be replaced with "newtext" */
$file = file_get_contents("/path/to/log", true);
$lines = explode("\n", $file);
foreach ($lines as $line)
  $correctline = preg_replace( '/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\sconnected/', 'newtext', $line );
  echo $correctline;
}
于 2013-08-04T19:19:42.877 回答
0

如果您逐行遍历文件,则可以使用preg_match检查该行是否包含/字符,如果包含则跳过回显。如果没有,首先将它们拆分为新行并遍历该数组。

如果您不想拆分文件,您可以使用正则preg_replace表达式,例如(^|\n).*/.*(\n|$)替换为空字符串。

于 2013-08-04T19:22:32.987 回答
0
<?php
    $file = file_get_contents("/path/to/log", true);
    $lines = explode("\n", $file);
    foreach ($lines AS $num => $line)
    {
        if ( strpos($line, "/") === false ) // Line doesn't contain "/"
        {
            echo htmlspecialchars($line) . "\n";
        }
    }
?>
于 2013-08-04T19:33:12.047 回答