0

我有一个正则表达式可以验证从 00000000 到 9999999999 的值。现在我需要添加从 +/-00000000 到 +/-9999999999 的正/负验证

我用:

    /^[0-9]{8,10}$/

但无法添加我尝试的 +/- 验证:

    /(-|+)(^[0-9]{8,10})$/
    /[-+](^[0-9]{8,10})$/
    /^[-+][0-9]{8,10}$/

如何验证字符串 +/-00000000 -> +/-9999999999?

[编辑] 使用:

if (
    !preg_match( "/^[-+]([0-9]{4}).(((0[13578]|(10|12)).(0[1-9]|[1-2][0-9]|3[0-1]))|(02.(0[1-9]|[1-2][0-9]))|((0[469]|11).(0[1-9]|[1-2][0-9]|30)))$/", $_POST[$field] ) ||
    !preg_match( "/^[-+]([0-9]{5,7}).((0[13578]|(10|12))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$/", $_POST[$field] ) ||
    !preg_match( "/^[-+][0-9]{8,10}$/", $_POST[$field] )
) {
    $this->errors[] = $errorMessage;
}

验证模式应该是:

+/-0000.01.01 +/-9999.12.31

+/-10000.01 +/-9999999.12

+/-10000000 +/-9999999999

这是出于日期目的..我收到此错误:编译失败:在偏移量 3 处没有可重复的内容

可能是因为脚本也尝试验证第一个和第二个模式... 99%

我还看到该模式验证了一个错误的 +00000000(8digit),因为我需要从 +10000000 开始

4

3 回答 3

2

没有理由这不应该工作:

<?php
$string = '-0000000000';
$pattern = '/^[-+][0-9]{8,10}$/';
if (preg_match($pattern, $string, $matches)) {
  print_r($matches);
}
else {
  print 'No matches found.';
}
于 2013-09-07T19:01:09.540 回答
1

问题不在于您的正则表达式,而在于您的 if 语句的逻辑。你写:

if (!preg_match(...) || !preg_match(...) || !preg_match(...)) { ...

您应该更正:

if (!preg_match(...) && !preg_match(...) && !preg_match(...)) { ...

或者

if (!(preg_match(...) || preg_match(...) || preg_match(...))) { ...
于 2013-09-07T19:27:12.727 回答
0

试试这个:

if (
    !preg_match("/^[-+][0-9]{4}\.(((0[13578]|(10|12))\.(0[1-9]|[1-2][0-9]|3[0-1]))|(02\.(0[1-9]|[1-2][0-9]))|((0[469]|11)\.(0[1-9]|[1-2][0-9]|30)))$/", $_POST[$field] ) &&
    !preg_match("/^[-+][1-9][0-9]{4,6}\.(0[1-9]|1[0-2])$/", $_POST[$field] ) &&
    !preg_match("/^[-+][1-9][0-9]{7,9}$/", $_POST[$field] )
) {
    $this->errors[] = $errorMessage;
}

您的第二个正则表达式试图匹配日期,而您的第一个正则表达式需要转义句点。我改变了一些范围以避免00000000像你提到的那样。

除此之外,您错误地放置了线锚的开头并使用||而不是&&因为所有三个都不能给出错误。

于 2013-09-07T19:30:03.747 回答