Php 使用preg_match验证多个格式

Php 使用preg_match验证多个格式,php,regex,preg-match,Php,Regex,Preg Match,我有一个电话号码字段,设置为使用preg_match进行验证: function ValidPhone($phone) { return preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', trim($phone)); } 这确保电话号码以xxx xxx xxxx格式输入,并且是数字 我对regexp不是很熟悉;有人能告诉我如何扩展它以允许多种格式吗?i、 e.xxx xxx xxxx或xxx.xxx.xxxx或(xxx)xxx xxxx 谢谢。我

我有一个电话号码字段,设置为使用preg_match进行验证:

function ValidPhone($phone) {
    return preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', trim($phone));
}
这确保电话号码以xxx xxx xxxx格式输入,并且是数字

我对regexp不是很熟悉;有人能告诉我如何扩展它以允许多种格式吗?i、 e.xxx xxx xxxx或xxx.xxx.xxxx或(xxx)xxx xxxx


谢谢。

我认为最简单的解决办法是先去掉所有不是数字的东西:

function ValidatePhone($phone) {
    $phone = preg_replace('/\D+/', '', $phone);
    return strlen($phone) == 10;
}
由于您要验证的是格式,而不是内容,因此应执行以下操作:

function ValidatePhone($phone) {
    $patterns = array(
        '\d{3}([-\. ])\d{3}\g{-1}\d{4}',
        '\(\d{3}\) \d{3}-\d{4}'
        );

    $phone = trim($phone);

    foreach ($patterns as $pattern) {
        if (preg_match('/^' . $pattern . '$/', $phone))
            return true;
    }

    return false;                                                                                                                   
}

我认为最简单的解决方案是首先去掉所有不是数字的东西:

function ValidatePhone($phone) {
    $phone = preg_replace('/\D+/', '', $phone);
    return strlen($phone) == 10;
}
由于您要验证的是格式,而不是内容,因此应执行以下操作:

function ValidatePhone($phone) {
    $patterns = array(
        '\d{3}([-\. ])\d{3}\g{-1}\d{4}',
        '\(\d{3}\) \d{3}-\d{4}'
        );

    $phone = trim($phone);

    foreach ($patterns as $pattern) {
        if (preg_match('/^' . $pattern . '$/', $phone))
            return true;
    }

    return false;                                                                                                                   
}
美国数字:

\(?[2-9]\d\d)?[ -\.]?[2-9]\d\d[ -\.]?\d{4} 
美国数字:

\(?[2-9]\d\d)?[ -\.]?[2-9]\d\d[ -\.]?\d{4} 
\d:
一位数[0-9]

\d{3}:
三位一位数

|:
逻辑或

\d:
一位数[0-9]

\d{3}:
三位一位数


|:
逻辑或

如果要使用正则表达式进行匹配,则需要确切了解需要支持的格式。我认为一个更好的选择是肖恩在下面的建议。匹配一个或两个以上格式的正则表达式将变得相当复杂。不幸的是,我们确实需要匹配我在OP中提到的精确格式。如果您使用正则表达式进行匹配,您需要确切地知道您需要支持哪些格式。我认为一个更好的选择是肖恩在下面的建议。一个正则表达式匹配一个或两个以上的格式会变得相当复杂。不幸的是,我们确实需要匹配我在OP中提到的精确格式。不幸的是,这不是我们需要的。我们需要验证非常特定的格式,即我在OP.Update中提到的格式。顺便说一句,如果这是为了验证用户在UI中提供的数据,请帮你的用户一个忙,并对你将接受的内容更加宽容。理想情况下,您只需存储电话号码的10位数字(假设NPA编号),并在返回UI的过程中按照您的意愿对其进行格式化。谢谢。我试试看。它部分用于用户提供的数据,但用于验证我们从外部服务接收的数据的脚本相同,因此验证必须在我们接收数据时进行,而不是在输入数据时进行。不幸的是,这不是我们需要的。我们需要验证非常特定的格式,即我在OP.Update中提到的格式。顺便说一句,如果这是为了验证用户在UI中提供的数据,请帮你的用户一个忙,并对你将接受的内容更加宽容。理想情况下,您只需存储电话号码的10位数字(假设NPA编号),并在返回UI的过程中按照您的意愿对其进行格式化。谢谢。我试试看。它部分用于用户提供的数据,但用于验证我们从外部服务接收的数据的脚本相同,因此验证必须在我们接收数据时进行,而不是在输入数据时。