我有一个通过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
答案 0 :(得分:0)
这段代码显示了当我们尝试这两种方法时会发生什么:
<?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
之类的序列,您将无法以编程方式进行清理。
恕我直言,如果我在这里没有记错的话,您应该寻找这种行为的根源。错误报告?