【问题标题】:Php removing special characters from log using sed or preg_replacephp 使用 sed 或 preg_replace 从日志中删除特殊字符
【发布时间】:2013-08-11 18:22:26
【问题描述】:

我正在使用这个 AJAX Logfile Tailer & Viewer: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

[something] 部分很好,但 [0;35;1m ... [m 需要删除。

【问题讨论】:

    标签: php sed exec tail


    【解决方案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");
    ?>
    

    【讨论】:

    • 感谢您的回复!出于某种原因,我仍然在输出中看到特殊字符:[0;35;1m[something] text here[m
    • 尝试改用这个正则表达式:'/\x1B\[[0-9;]*m/'.
    • 我已经意识到答案是正确的,但我走错了路。我需要使用 str_replace 来替换奇数字符而不是 preg_replace。我会将此标记为已回答,因为您是正确的 loentar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2011-12-12
    • 2011-12-21
    相关资源
    最近更新 更多