- Последовательности \ b на самом деле не говорят, сколько символов нам нужно удалить.
- Кроме того, удаление всех из них оставит вас с оставшимися пробелами, которые вы не сможете определить, еслиони должны быть удалены или нет.
Этот фрагмент кода показывает, что происходит, когда мы пробуем эти два подхода:
<code><?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 "
";?>
(Вы можете попробовать этот код с помощью 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
, которые вы не сможете очистить программно.
ИМХО, если я не ошибся здесь, вы должны искать корень этого поведения.отчет