PHP中特定字符串所需的正则表达式

时间:2012-12-25 16:39:01

标签: regex string validation

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

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

4 个答案:

答案 0 :(得分: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中,如果它有效。

即便如此,您也无法验证电话号码。有效的电话号码格式并不意味着它是有效的号码。为此,根据号码生成短信或呼叫,并发送激活码。一旦用户输入代码,电话号码就完全有效。

答案 1 :(得分:1)

我们试试......

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

打破这个局面:

  • 我们从积极的前瞻开始,需要至少7次数字。
  • 然后我们匹配所有有效字符,包括加号。
  • 然后匹配所有有效字符,加上6到20次。

答案 2 :(得分:1)

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

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

但是我个人会这样做:

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

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

答案 3 :(得分: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;
}