Php 带有区号的电话国家/地区代码的正则表达式

Php 带有区号的电话国家/地区代码的正则表达式,php,regex,pcre,Php,Regex,Pcre,我需要一个正则表达式来匹配此国家代码+区号电话格式: 1-201 其中前两个字符始终为1,最后3个字符为201和989之间的数字 我当前有[1][\-][0-9]{3}来指定1-xyz和限制长度,但如何让最后一个组限制这些范围 这将在PHP中使用。使用此正则表达式: ^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$ 以下是三个捕获组/范围的说明: 2\d[1-9]匹配201到299 [3-8]\d{2}匹配300到899 9[0-8]\d匹配900到989 这里

我需要一个正则表达式来匹配此国家代码+区号电话格式:

1-201
其中前两个字符始终为1,最后3个字符为201和989之间的数字

我当前有[1][\-][0-9]{3}来指定1-xyz和限制长度,但如何让最后一个组限制这些范围

这将在PHP中使用。

使用此正则表达式:

^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$
以下是三个捕获组/范围的说明:

2\d[1-9]匹配201到299 [3-8]\d{2}匹配300到899 9[0-8]\d匹配900到989

这里有一个链接,您可以在其中测试此正则表达式:

^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$
更新:

显然,Laravel不喜欢有这么多嵌套的捕获组,但这种简化应该可以满足您的需要:

1-(2\d[1-9]|[3-8]\d{2}|9[0-8]\d)
使用此正则表达式:

^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$
以下是三个捕获组/范围的说明:

2\d[1-9]匹配201到299 [3-8]\d{2}匹配300到899 9[0-8]\d匹配900到989

这里有一个链接,您可以在其中测试此正则表达式:

^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$
更新:

显然,Laravel不喜欢有这么多嵌套的捕获组,但这种简化应该可以满足您的需要:

1-(2\d[1-9]|[3-8]\d{2}|9[0-8]\d)

我不会为此使用正则表达式。这将是混乱和难以维持

我会这样做:

$strings = array('1-201', '1-298', '1-989', '1-999', '1-200');
foreach($strings as $string) {
    $value = explode('1-', $string);
    if($value[1] >= 201 & $value[1] <= 989) {
        echo 'In range' . $string  . "\n";
    } else {
        echo 'out of range' . $string . "\n";
    }
}

我不会为此使用正则表达式。这将是混乱和难以维持

我会这样做:

$strings = array('1-201', '1-298', '1-989', '1-999', '1-200');
foreach($strings as $string) {
    $value = explode('1-', $string);
    if($value[1] >= 201 & $value[1] <= 989) {
        echo 'In range' . $string  . "\n";
    } else {
        echo 'out of range' . $string . "\n";
    }
}
这应该行得通

1-(20[1-9]|2[1-9][0-9]|[3-8][0-9][0-9]|9[0-8][0-9])
或者

1-(20[1-9]|2[1-9]\d|[3-8]\d{2}|9[0-8]\d)
来源:

这应该行得通

1-(20[1-9]|2[1-9][0-9]|[3-8][0-9][0-9]|9[0-8][0-9])
或者

1-(20[1-9]|2[1-9]\d|[3-8]\d{2}|9[0-8]\d)

资料来源:

我想我会像下面在C.实验中那样做

string tester = "1-201";

Match match = Regex.Match(tester, @"(?<one>1-)(?<Two>[0-9]{3})");

//MessageBox.Show(match.Groups[2].Value);

int x = Convert.ToInt32(match.Groups[2].Value);

if (x <= 201 && x > 989)
{
    //Exclude those captures not necessary.
    //Use the captures within the range.
}

我想我会像下面在C中那样做

string tester = "1-201";

Match match = Regex.Match(tester, @"(?<one>1-)(?<Two>[0-9]{3})");

//MessageBox.Show(match.Groups[2].Value);

int x = Convert.ToInt32(match.Groups[2].Value);

if (x <= 201 && x > 989)
{
    //Exclude those captures not necessary.
    //Use the captures within the range.
}


这相当棘手。正则表达式并不总是最好的答案,特别是对于那些需要在3年内维护代码的可怜人来说。然而,仅仅因为你有正则表达式就可以做到这一点并不意味着你应该使用它们。这里的正则表达式将很难阅读,并且在别人第一次更新它时会被抛出。我不同意我的观点。从我所看到的情况来看,使用正则表达式验证电话号码格式是相当常见的,将其插入测试仪可以很容易地识别发生了什么。我是个regex的白痴,我完全理解这一点。这相当棘手。正则表达式并不总是最好的答案,特别是对于那些需要在3年内维护代码的可怜人来说。然而,仅仅因为你有正则表达式就可以做到这一点并不意味着你应该使用它们。这里的正则表达式将很难阅读,并且在别人第一次更新它时会被抛出。我不同意我的观点。从我所看到的情况来看,使用正则表达式验证电话号码格式是相当常见的,将其插入测试仪可以很容易地识别发生了什么。我是一个正则表达式白痴,我完全理解它。虽然@Tim Biegeleisen的答案是有效的,但出于某种原因,只有这一个在我的Laravel 5应用程序中有效……我研究了DarkSigma的正则表达式并提高了我的知识。@Tim提供的正则表达式在290之前(包括290)都不会匹配,因为2\d[1-9]只允许1到9的数字出现在1的列中,而不是0。虽然@Tim Biegeleisen的答案是有效的,但出于某种原因,只有这一个在我的Laravel 5应用程序中有效……我研究了DarkSigma的正则表达式,并提高了我的知识水平。@Tim提供的正则表达式在210、220、230等上不匹配,直到并包括290,因为2\d[1-9]只允许1的列中的数字1到9,而不是0。这很奇怪,实际上它在测试站点上完全验证了,但是出于某种原因,在我的Laravel应用程序中使用它来验证路由在第二和第三个子表达式上不起作用-它失败了,就好像字符串不匹配一样。尝试使用以下方法:1-2\d[1-9]|[3-8]\d{2}|9[0-8]\dOK那么看来Laravel被太多的嵌套捕获组窒息了。我刚刚学到了一些东西:-这很奇怪,实际上它在测试站点上可以完美地验证,但是出于某种原因,在我的Laravel应用程序中使用它来验证路由在第二和第三个子表达式上不起作用-它失败了,就好像字符串不匹配一样。尝试使用这个:1-2\d[1-9]|[3-8]\d{2}|9[0-8]\dOK那么看来Laravel被太多的嵌套捕获组窒息了。我刚刚学到了一些东西:-但我的应用程序是针对PHP的。你只需要在PHP中获得等效的正则表达式,然后编写其余的代码。搜索对你很有用。但我的应用程序是针对PHP的。你只需要在PHP中获得等效的正则表达式,然后编写其余的代码。搜索将证明对你有用。