1

我需要一个正则表达式来验证具有以下条件的字符串

  1. 字符串可能包含任何数字空格 + - () / 。
    如果字符串包含其他任何内容,那么它应该是无效的
  2. 如果字符串中有 + 则应该在开头,最多有一个 + ,否则无效,如果有多个 + 则无效
  3. 字符串长度应为 7 到 20 个字符
  4. 所有这些数字都不是必须有空格 + - () / 。
    但必须包含至少 7 位数字
4

4 回答 4

2

我认为您正在使用E.164格式验证电话号码。电话号码可以包含许多其他格式。它也可以包含.。一个数字中有多个空格并不少见。因此,最好将所有数字格式化为通用格式并将该格式存储在 db 中。如果该通用格式错误,您可能会抛出错误。

我像这样验证那些电话号码。

function validate_phone($phone){
    // replace anything non-digit and add + at beginning
    $e164 = "+". preg_replace('/\D+/', '', $phone);
    // check validity by length;
    return (strlen($e164)>6 && strlen($e164)<21);
}

如果有效,我在这里存储$e164在 Db 中。

即使在那之后,您也无法验证电话号码。有效的电话号码格式并不意味着它是有效的号码。为此,会针对该号码生成一条短信或呼叫,并发送激活码。一旦用户输入代码,电话号码就被完全验证了。

于 2012-12-25T16:46:28.257 回答
1

咱们试试吧 ...

preg_match('/^(?=(?:.*\d){7})[+\d\s()\/\-\.][\d\s()\/\-\.]{6,19}$/', $text);

打破这个:

  • 我们从一个至少需要 7 次数字的积极前瞻开始。
  • 然后我们匹配所有有效字符,包括加号。
  • 然后匹配所有没有加号的有效字符 6 到 20 次。
于 2012-12-25T16:44:37.970 回答
1

您可以在一个正则表达式中执行此操作:

/^(?=(?:.*\d){7})[0-9 ()\/+-][0-9 ()\/-]{6,19}$/

但是我个人会做类似的事情:

/^[0-9 ()\/+-][0-9 ()\/-]{6,19}$/

然后剥离任何非数字并查看剩余的字符串是否为 7 或更长。

于 2012-12-25T16:45:25.677 回答
0

更简洁一点:

^\+?(?=(.*\d){7})[()/\d-]{7,19}$

'当然,你为什么还要使用正则表达式?

function is_valid($string) {
    $digits = 0;
    $length = strlen($string);

    if($length < 7 || $length > 20) {
        return false;
    }

    for($i = 0; $i < $length; $i++) {
        if(ctype_digit($string[$i])) {
            $digits++;
        } elseif(strpos('+-() ', $string[$i]) === false && ($string[$i] !== '+' || $i !== 0)) {
            return false;
        }
    }

    return $digits >= 7;
}
于 2012-12-25T16:48:49.667 回答