Php 从电话号码中提取业务扩展名的正则表达式

Php 从电话号码中提取业务扩展名的正则表达式,php,regex,phone-number,Php,Regex,Phone Number,我正在尝试编写一个正则表达式,从完整的电话号码字符串中提取电话分机。这应该适用于这样的数字:777.777.7777 x 7302 它还应该使用“ext”、“ext”、“ext”、“ext”、“ext.”和“ext”。基本上只是涵盖了它的所有共同用途 我只需要“x 7302”部分。事实上,一旦我提取了它,我会把它剥离成分机号码 有人能帮我吗?当正则表达式变得更复杂时,我会很难处理它们 如果PHP函数(preg_match)对任何人都有帮助的话,我将在PHP函数(preg_match)中执行此操作

我正在尝试编写一个正则表达式,从完整的电话号码字符串中提取电话分机。这应该适用于这样的数字:777.777.7777 x 7302

它还应该使用“ext”、“ext”、“ext”、“ext”、“ext.”和“ext”。基本上只是涵盖了它的所有共同用途

我只需要“x 7302”部分。事实上,一旦我提取了它,我会把它剥离成分机号码

有人能帮我吗?当正则表达式变得更复杂时,我会很难处理它们


如果PHP函数(preg_match)对任何人都有帮助的话,我将在PHP函数(preg_match)中执行此操作。

这可能有助于为您提供一些可玩的东西:

$phonenumber = '777.777.7777 x 7302';

$extension = preg_replace('(^.*(ext|x) ?([0-9]+)$)i', '$2', $phonenumber);

echo $extension;
使用
i
修饰符(在末尾)使正则表达式不区分大小写,以便匹配
ext
的所有组合。我使用了一个组来提供这两种变体:
ext
x
(ext | x)

其余部分在末尾寻找一个数字,EXT和数字之间可能有一个空格

\w+\s*\d+$

这是一个更简单的正则表达式,假设输入与您提供的内容相似。

这应该可以满足您的需要

/([\d\-\.]+)([ext\. ]+)(\d+)/i
第一组匹配由破折号或点分隔的数字。第二组匹配您的分机字符串,第三组匹配您的分机号码

尝试使用正则表达式:

/e?xt?\.?\s*\d+$/i 

<?

echo "<pre>";
     $phone = '777.777.7777 x 7302'; 
        preg_match("/e?xt?\.?\s*\d+$/i", $phone, $matched); 
        print_r($matched);
?>

如果只需要字符串的最后一个数字,可以使用:

$pn = "777.777.7777 x 7302"; 

function get_ext($pn)
{
$ext = preg_replace('/[\d\.\s]+[ext\s]+(\d{1,})/i', '$1', $pn);
return $ext;
}

echo get_ext($pn);
//7302
\D+
至少有一个非数字后跟:

(\d+)
至少一位数字(使用括号捕获)

$
在字符串末尾。

尝试此功能:


我对正则表达式有点怀疑,所以当我说,可以使用PHP函数“explode()”,使用“x”字符作为分隔符来拆分字符串吗

如果您不熟悉该函数,这里有一个指向该函数的PHP手册的链接:


如何
$2
将为我提供
7302
,您能解释一下吗?@user:
$2
包含第二组的匹配项:
([0-9]+)
+1,用于明确提及
i
修饰符并解释它。我觉得@themask的正则表达式可能更好,尽管我喜欢它。我感谢你的帮助。我投票给了你一个很好的答案,但我不得不选择下面的答案,因为它解决了我的问题。这里再次不同于hakre的帖子,
$matched
如何从正则表达式中得到匹配的输出?我不得不说这一条对我有效。我有一个可能的模式的大列表,并把它放在列表的末尾(甚至在上面列出的另一个模式答案的下面),它是唯一找到它的。谢谢
\D+(\d+)$
$pn = "777.777.7777 x 7302"; 

function get_ext($pn)
{
$ext = preg_replace('/[\d\.\s]+[ext\s]+(\d{1,})/i', '$1', $pn);
return $ext;
}

echo get_ext($pn);
//7302