php从输出中删除特定结果

时间:2013-04-16 10:32:03

标签: php preg-replace shell-exec

我正在使用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”;它。

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

2 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分: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匹配:)。