php正则表达式最小和最大长度不能按预期工作

时间:2014-03-21 14:32:35

标签: php regex max minimum

我想在PHP中创建一个正则表达式,允许用户输入下面任何一种格式的电话号码。

345-234 898

345 234-898

235-123-456

548 812 346

最小长度应为7,最大长度应为12。

问题在于,正则表达式并不关心最小和最大长度。我不知道它有什么问题。请帮我解决一下。这是正则表达式。

if (preg_match("/^([0-9]+((\s?|-?)[0-9]+)*){7,12}$/", $string)) {
echo "ok";
} else {
echo "not ok";
}

感谢您阅读我的问题。我会等待回复。

5 个答案:

答案 0 :(得分:2)

只需这样做:

if (preg_match("/^\d{3}[ -]\d{3}[ -]\d{3}$/", $string)) {

此处\d表示来自0-9的任何数字。此外[ -]表示空格或连字符

答案 1 :(得分:2)

您可以使用preg_replace去除非数字符号并检查结果字符串的长度。

$onlyDigits = preg_replace('/\\D/', '', $string);
$length = strlen($onlyDigits);
if ($length < 7 OR $length > 12)
  echo "not ok";
else
  echo "ok";

答案 2 :(得分:2)

您应该在模式上使用开始(^)和结束($)符号

$subject = "123456789";
    $pattern = '/^[0-9]{7,9}$/i';
    if(preg_match($pattern, $subject)){
        echo 'matched';
    }else{
        echo 'not matched';
    }

答案 3 :(得分:1)

您可以在模式开头使用前瞻断言(?=...)检查长度:

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

答案 4 :(得分:0)

分解原始正则表达式,它可以如下所示:

^                   # start of input
(
    [0-9]+          # any number, 1 or more times
    (
        (\s?|-?)    # a space, or a dash.. maybe
        [0-9]+      # any number, 1 or more times
    )*              # repeat group 0 or more times
)
{7,12}              # repeat full group 7 to 12 times
$                   # end of input

所以,基本上,你允许“任意数量,1次或更多次”,然后是“任意数量1次或更多次,0次或更多次”重复“7到12次” - 这种杀戮你的长度检查。

您可以采取更有限的方法并写出每个单独的数字块:

(
    \d{3}         # any 3 numbers
    (?:[ ]+|-)?   # any (optional) spaces or a hyphen
    \d{3}         # any 3 numbers
    (?:[ ]+|-)?   # any (optional) spaces or a hyphen
    \d{3}         # any 3 numbers
)

简化为:

if (preg_match('/^(\d{3}(?:[ ]+|-)?\d{3}(?:[ ]+|-)?\d{3})$/', $string)) {

如果要将分隔符限制为单个空格连字符,则可以更新正则表达式以使用[ -]而不是(?:[ ]+|-);如果您希望这是“可选”(即数字组之间不能有分隔符),请在每个数字组的末尾加?

if (preg_match('/^(\d{3}[ -]\d{3}[ -]\d{3})$/', $string)) {