1

我正在使用 php 来获取一个 shell 输出,它meetme为我列出了所有的频道。我只想从下到上抓住Conf Num那个0001。在下面的示例中,我想分配变量:$confnum="32";

到目前为止,这是我的代码:

$output = shell_exec("asterisk -rx 'meetme list'");

echo $output;

请帮我从 $output 中获取结果。

这是执行 meet.php 文件时会得到的结果

[root@C1033-TF agi-bin]# php meet.php
Conf Num       Parties        Marked     Activity  Creation  Locked
67             0001       N/A        00:00:16  Dynamic   No    
28             0001       N/A        00:00:19  Dynamic   No    
65             0001       N/A        00:01:14  Dynamic   No    
42             0001       N/A        00:01:18  Dynamic   No    
32             0001       N/A        00:04:18  Dynamic   No    
* Total number of MeetMe users: 5

请记住,有时在 Conf Num 中会有不止 0001 个方。在上面的例子中,我只想抓住这条线:

32             0001       N/A        00:04:18  Dynamic   No

这是具有 0001 的最后一行,因此分配 $confnum="32"; 给它。

非常感谢我能得到的任何帮助。

4

2 回答 2

1

好的,假设 Linux,您可以完全在 shell 中执行此操作:

  • 过滤最后一行:grep -v 'Total number of MeetMe isers'
  • 过滤第一行:grep -v 'Conf Num'
  • 并且只打印一个Conf Numawk 'BEGIN{ result=""; } {if( $2 == "0001"){result=$1;}} END {print result;}'

所以整个代码:

$output = shell_exec("asterisk -rx 'meetme list' | grep -v 'Total number of MeetMe isers' | grep -v 'Conf Num' | awk 'BEGIN{ result=\"\"; } {if( \$2 == \"0001\"){result=$1;}} END {print result;}'");
// $output should contain your data :)

或使用preg_match_all()

$output = shell_exec("asterisk -rx 'meetme list'");
$matches = array();
$result = null;
preg_match_all('~^\s*(\\d+)\\s+0001~', $output, $matches, PREG_SET_ORDER);
foreach( $matches as $match ){
  $result = $match[1];
}

回应评论:

您应该学习和的正则表达式语法和\d含义+\d+将匹配00100000000000000000000000000000000:)。

于 2013-04-16T10:47:36.223 回答
1

您可以使用 exec 而不是 shell_exec 并遍历输出行:

<?php
$output = array();
exec("asterisk -rx 'meetme list'", $output);

foreach ($output as $line) {
   if (preg_match('/^32\s/', $line)) { //Check line starts with 32
      echo $line;
   }
}

编辑:

<?php
$output = array();
exec("asterisk -rx 'meetme list'", $output);

$lines = sizeof($output);    
for ($i = $lines -1; $i >=0 ; $i--) {
   if (preg_match('/^(\d+)\s+0001\s/', $output[$i], $matches)) { //Check line contains 0001
      $firstNumber = $matches[1];
      echo $firstNumber;
      break;
   }
}
于 2013-04-16T10:40:03.337 回答