我有当前的代码
$trace = exec("tracert 192.168.0.1", $outcome, $status);
print_r($outcome);
输出如下数组:
Array ( [0] => [1] => Tracing route to 192.168.0.1 over a maximum of 30 hops [2] => [3] => 1 <1 ms <1 ms <1 ms 192.168.1.1 [4] => 2 5 ms 4 ms 4 ms 192.168.0.1 [5] => [6] => Trace complete. )
现在我特别想要的是元素3和4中的延迟值(ms)。我可以使用print_r($ outcome [3])来获取这些,例如输出:
1 <1 ms <1 ms <1 ms 192.168.1.1
然而,我想要的只是'<1ms <1ms <1ms
'位。
最好的方法是什么?请记住,这只是一个例子,这些值可能会发生变化。
非常感谢任何建议或意见!谢谢:))
答案 0 :(得分:2)
答案 1 :(得分:0)
你可能需要调整一下,但这是一个开始:
此外,这适用于原始输出,而不是数组。我会将exec()
更改为system()
并使用输出缓冲区捕获输出。或者,您可以修改代码并在exec。
preg_match
preg_match_all('/(<?[0-9]+ ms <?[0-9]+ ms <?[0-9]+ ms)/i', $subject, $result, PREG_PATTERN_ORDER);
答案 2 :(得分:0)
使用strrpos
可以查找字符串中最后一次出现的子字符串的位置。因此,如果你知道它总是输出'ms'作为最后一次出现,你可以使用:
$last_occurrence = strrpos($outcome[3], ' ms');
返回字符串的第一个(但多个)字符:
$adjusted_string = substr($outcome[3], 0, $last_occurrence);
修改强>
摆脱第一个角色:
echo substr($adjusted_string, 1);
所以,如果你想将它们组合在一起:
echo substr(substr($outcome[3], 0, strrpos($outcome[3], ' ms')), 1);
答案 3 :(得分:0)
如果它保持相同的模式,你可以
list(,$l1,$lu1,$l2,$lu2,$l3,$lu3,) = explode(" ", $outcome[3]);
echo $l1.$lu1.' '.$l2.$lu2.' '.$l3.$lu3;
答案 4 :(得分:0)
希望这会有所帮助:
// create array to store the results
$result = array();
// loop through all lines of the outcome
foreach ($outcome as $line)
{
// continue to the next line if there is no "ms" information in the line
if (strpos($line, 'ms') === FALSE)
{
continue;
}
// remove the initial number (counter) from the line
$line = ltrim($line, '0123456789');
// split the string in pieces
$latency_values = explode(' ms ', $line);
// throw away the latest element (IP address)
array_pop($latency_values);
// remove surrounding white spaces
$latency_values = array_map('trim', $latency_values);
// add to our result array
$result[] = $latency_values;
}
// output the result
print_r($result);
此解决方案使用: