【问题标题】:Regular expression needed for specific string in PHPPHP中特定字符串所需的正则表达式
【发布时间】:2012-12-25 16:39:00
【问题描述】:

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

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

【问题讨论】:

  • 那么...你尝试了什么?
  • 为什么要一个正则表达式?您提到的某些条件显然可以在不使用正则表达式的情况下以更有效的方式实现,即使这意味着编写更多代码行。
  • 如果您正在寻找电话号码验证,请参阅我的回答。

标签: regex string validation


【解决方案1】:

我认为您正在使用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 中。

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

【讨论】:

  • 它不仅仅是验证:它清理输入(不向用户反馈),然后验证数字。不过,这种方法有利有弊。
  • 你能提供缺点吗?我在已经投入生产的应用程序中使用相同的方法。我们还通过稍后发送短信来验证手机。
  • 你的方法是极端放纵的——它不关心原始输入是否包含垃圾(二进制数据、字母等),只是将所有内容都剥离到数字。我个人认为不应该处理全部垃圾。 (我认为在这种情况下,劣势并没有真正体现出来)。
  • 当它的电话号码为什么需要二进制数据甚至字母?
  • 问题是它认为以前明显无效输入的清理版本是有效的。
【解决方案2】:

你可以在一个正则表达式中做到这一点:

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

但是我个人会做这样的事情:

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

然后去掉任何非数字,看看剩下的字符串是否为 7 或更长。

【讨论】:

  • /^[0-9 ()\/+-][0-9 ()\/-]{6,19}$/ 这不验证 - 但如果我的字符串包含 -那么它应该是真的。我怎样才能做到这一点?还是谢谢你的回答
【解决方案3】:

让我们试试……

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

分解:

  • 我们从需要至少 7 次数字的正向预测开始。
  • 然后我们匹配所有有效字符,包括加号。
  • 随后匹配所有不带加号的有效字符 6 到 20 次。

【讨论】:

  • 我应该使用 preg_match 吗?你能给我举个例子吗?我对正则表达式完全陌生。无论如何,感谢您的帮助。
  • 末尾缺少$,并且您允许字符串有21个字符。
  • 这仍然允许多个连续的-. - 可以吗?例如,0000-000-- 会匹配。如果不是,我们需要修改正则表达式。
【解决方案4】:

简洁一点:

^\+?(?=(.*\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;
}

【讨论】:

  • 这在长度计算中不包括+,因此您将不允许没有+ 的20 个字符的字符串。
  • @MartinBaulig:是的,我认为添加 + 可能不应该改变最大长度,因为它是可选的。如果我错了……这不是正确的,那么:)
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多