正则表达式添加更多条件以检查无效的电话号码

时间:2015-09-24 07:21:18

标签: regex preg-match

这是一个接受印度电话号码的表达式。在不改变现有表达式的功能的情况下,需要进行哪些更改以使一个或多个标准不接受以下数字 9999999999个
8888888888个
7777777777个
9898989898个
9797979797个
8787878787个
8989898989个
7878787878个
7979797979个

由于

$input = trim($input); //get rid of spaces at either end
if (preg_match('/^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?([789]\d{9})$/', $input, $m) == 1){
    return '+91'.$m[2];

2 个答案:

答案 0 :(得分:0)

您可以在正则表达式中添加一些负向前瞻,以避免匹配重复的数字:

^(?:(?:\+|0{0,2})91(?:\h*-\h*)?|0?)?(([789])(?!\2+$)(\d)(?!(?:\2\3)+$)\d{8})$

RegEx Demo

    如果重复相同的数字直到结束,
  • (?!\2+$)将避免匹配。

  • (?!(?:\2\3)+$)将在重复相同的2位数组时失败。

答案 1 :(得分:0)

在最后一个捕获组之前放置一个负向前瞻,以检查后面的两个数字是否重复,直到结束:

$pattern = '~^(?>(?:\+|00?)?91(?:\s*-\s*)?|0)?(?!(.[789])\2+$)([789]\d{9})$~';

if (preg_match($pattern, $input, $m)) // testing if preg_match returns 1 is useless
    return '+91' . $m[2];

如果您希望不那么具体(第二个数字不在[789]中),请将(?!(.[789])\2+$)替换为(?!(..)\2+$)

注意:如果您需要检查其他条件,以更易读的方式编写模式会很有用:

$pattern = '~
# named groups definition
(?(DEFINE)  
    (?<repeated> (..) \g{-1}+ $ )
    (?<cond2> .* 666 )
    # etc.
    (?<badnum> \g<repeated> | \g<cond2> )
)
# main pattern
^
(?> (?:\+|00?)? 91 (?:\s*-\s*)? | 0 )? # optional prefix

(?! \g<badnum> ) (?<num> [789] \d{9} ) # last 10 numbers
$~x';

if (preg_match($pattern, $input, $m))
    return '+91' . $m['num'];

通过这种方式,您不需要使用多次检查,并且您的模式易于阅读和维护。