Php使用sed或preg_replace从日志中删除特殊字符

时间:2013-08-11 18:22:27

标签: php sed exec tail

我正在使用这个AJAX日志文件Tailer&查看器:http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/它运行良好,但在显示日志的页面上,它不会过滤任何特殊字符,因此看起来很混乱。我正在尝试修改logtail.php文件以清除特殊字符,但无法使其正常工作。

这是原始的logtail.php文件:

<?
// logtail.php
$cmd = "tail -50 /home/user/logfile.log";
exec("$cmd 2>&1", $output);
foreach($output as $outputline) {
 echo ("$outputline\n");
}
?>

这是我修改过的logtail.php文件,其中我试图清除以下特殊字符:

<?php
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

$cmd = "tail -50 /home/user/logfile.log";
exec("$cmd 2>&1", $output);

foreach($output as $outputline) {
 exec('sed -r '.escapeshellarg("s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g").' $output');
 echo ("$outputline\n");


}
?>

更新:我认为这应该采取原始输出,清除特殊字符,然后输出清理后的文本,但它不起作用,因为我仍然看到像这样的垃圾:

[0;35;1m[something] text here[m

[某事]部分很好但是[0; 35; 1米...... [m需要去。

1 个答案:

答案 0 :(得分:1)

输出源代码行而不是结果。

您的代码可能是这样的:

foreach($output as $outputline) {
 exec("echo \"$output\" | sed -r ".escapeshellarg("s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"), $output);
 echo ("$outputline\n");
}

但这效率不高。

更好就是使用preg_replace这样的功能:

<?php
// logtail.php
$cmd = "tail -50 /home/user/logfile.log";
exec("$cmd 2>&1", $output);

$str = implode('\n', $output);
$result = preg_replace('/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/', '', $str);

echo ("$result\n");
?>