在PHP中从sshseclib日志输出行中删除退格字符

时间:2019-01-31 17:47:14

标签: php regex

我有一个通过ssh连接到网络设备并执行某些功能的功能,问题是当行太长时,它充满了退格字符和重复的部分,我正在尝试格式化以使其易于阅读。我将这些行存储在数组中,并通过json传递它们。下面是一个示例:

$log .= $configure->exec("security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet");

及其输出:

OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$g 1 state enable mode permit ingress-type iph           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bs         \b\b\b\b\b\b\b\b\bt        \b\b\b\b\b\b\b\b        \b\b\b\b\b\b\b1      \b\b\b\b\b\b      \b\b\b\b\bp    \b\b\b\br   \b\b\bo  \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$enable mode permit ingress-type iphost 1 prot           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bc         \b\b\b\b\b\b\b\b\bo        \b\b\b\b\b\b\b\bl       \b\b\b\b\b\b\b       \b\b\b\b\b\bw     \b\b\b\b\be    \b\b\b\bb   \b\b\b   \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$e permit ingress-type iphost 1 protocol web t           \b\b\b\b\b\b\b\b\b\b\be          \b\b\b\b\b\b\b\b\b\bl         \b\b\b\b\b\b\b\b\bn        \b\b\b\b\b\b\b\be       \b\b\b\b\b\b\bt      \b\b\b\b\b\b\r\n

我设法通过preg_replace(“ / \ s \ s | [[:^ print:]] /”,“”,)摆脱了\ b和双精度空格,但这并不能解决问题,因为是重复的部分。下面是不带退格字符和双倍空格的输出,但是正如我所说,这并不能解决重复部分的实际问题:

OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph$g 1 state enable mode permit ingress-type iph os t1pr ot$enable mode permit ingress-type iphost 1 prot oc ol  w eb  t$e permit ingress-type iphost 1 protocol web t el ne t

1 个答案:

答案 0 :(得分:0)

  1. \ b序列并没有真正告诉我们必须去除多少个字符。
  2. 同时删除所有这些都将为您留下剩余的空间,您将无法告诉他们是否必须去除它们。

这段代码显示了当我们尝试这两种方法时会发生什么:

<?php
$log_line = <<<'EOF'
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$g 1 state enable mode permit ingress-type iph           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bs         \b\b\b\b\b\b\b\b\bt        \b\b\b\b\b\b\b\b        \b\b\b\b\b\b\b1      \b\b\b\b\b\b      \b\b\b\b\bp    \b\b\b\br   \b\b\bo  \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$enable mode permit ingress-type iphost 1 prot           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bc         \b\b\b\b\b\b\b\b\bo        \b\b\b\b\b\b\b\bl       \b\b\b\b\b\b\b       \b\b\b\b\b\bw     \b\b\b\b\be    \b\b\b\bb   \b\b\b   \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$e permit ingress-type iphost 1 protocol web t           \b\b\b\b\b\b\b\b\b\b\be          \b\b\b\b\b\b\b\b\b\bl         \b\b\b\b\b\b\b\b\bn        \b\b\b\b\b\b\b\be       \b\b\b\b\b\b\bt      \b\b\b\b\b\b
EOF;

// converting the line into an array of char
// str_replace here is useful to turn \b into one character,
// it will be easier to parse the string as an array below
$log_array = str_split(str_replace("\b", chr(8), $log_line));
$final_log_array = [];

// Now, we parse the log line char by char
foreach ($log_array as $char) {
    // if we encountered a '\b' character, we "pop"
    // the last character from the array
    // otherwise, we "push" the character to the array
    if ($char == chr(8))
        array_pop($final_log_array);
    else
        array_push($final_log_array,$char);
}

// Time to see the result
$final_log_line=implode($final_log_array);
echo "<pre>";
echo "Expected line:\n";
echo "OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet\n";
echo "Result line:\n";
echo $final_log_line . "\n";
echo "Line with all \b and double spaces removed:\n";
echo preg_replace("/(?:\\\b|\s\s)+/", "", $log_line);
echo "</pre>";
?>

(您可以使用PhpFiddle试试此代码。)

输出显示:

Expected line:
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet
Result line:
OLT-235(gpon-onu-mng)#$e permit ingress-type iphost 1 protocol web telnet
Line with all \b and double spaces removed:
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph$g 1 state enable mode permit ingress-type iph os t1pr ot$enable mode permit ingress-type iphost 1 prot oc ol  w eb  t$e permit ingress-type iphost 1 protocol web t el ne t

您会看到,第一次尝试会截断行的开头,而第二次尝试会给您留下类似protocol web t el ne t之类的序列,您将无法以编程方式进行清理。

恕我直言,如果我在这里没有记错的话,您应该寻找这种行为的根源。错误报告?