这是一个接受印度电话号码的表达式。在不改变现有表达式的功能的情况下,需要进行哪些更改以使一个或多个标准不接受以下数字
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];
答案 0 :(得分:0)
您可以在正则表达式中添加一些负向前瞻,以避免匹配重复的数字:
^(?:(?:\+|0{0,2})91(?:\h*-\h*)?|0?)?(([789])(?!\2+$)(\d)(?!(?:\2\3)+$)\d{8})$
(?!\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'];
通过这种方式,您不需要使用多次检查,并且您的模式易于阅读和维护。