2

来自标头的可能 SIP:

"unknown-caller-name" <sip:unknown-ani@pbx.domain.com:5066;user=phone>
"Henry Tirta" <sip:951@domain.com>

我需要使用正则表达式从 php 中的上述标头中提取<sip:&之间的 SIP 号码。@此 SIP 号码长度会有所不同。

$from = "\"User Name\" <sip:199@pbx.testdomain.com>";
$matches = array();
$pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/';
preg_match($pattern,$from,$matches);
$number = explode('@', $matches[0])[0];
echo $number;

有更好的方法吗?

4

3 回答 3

4

让我们简单点:

$from = '"unknown-caller-name" <sip:unknown-ani@pbx.domain.com:5066;user=phone>';
if(preg_match('#<sip:(.*?)@#', $from, $id)){
    echo $id[1];
}else{
    echo 'no match';
}

解释:

  • <sip:: 匹配<sip:
  • (.*?):匹配和分组所有不贪婪的东西,直到......
  • @:@找到/匹配。
于 2013-07-23T13:17:36.480 回答
0

我不知道这是否是更好的方法,但我做了一些更短的事情,并且我在正则表达式中使用了一个命名组

<?php
$pattern='/^(.*) <sip\:(?P<number>[0-9]+)@(.*)>$/';
$subject='"User Name" <sip:199@pbx.testdomain.com>';
preg_match($pattern,$subject,$matches);
echo $matches["number"];
?>

您可以通过更改 (.*) 部分来改进表达式,但我不知道您是否需要为此特定的东西

我希望这会对你有所帮助,祝你的代码好运

于 2013-07-23T13:11:00.877 回答
0
$string = '"User Name" <sip:199@pbx.testdomain.com>';

preg_match('/^(?:\"([^\"]+)\" )?\<sip\:(\d+)\@/i', $string, $matches);

// Output
array (size=3)
  0 => string '"User Name" <sip:199@' (length=21)
  1 => string 'User Name' (length=9)
  2 => string '199' (length=3)
于 2013-07-23T13:12:26.297 回答