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 で繰り返すものはありません

おそらく、スクリプトが 1 番目と 2 番目のパターンも検証しようとするためです... 99%

+10000000 から開始する必要があるため、パターンが間違っている +00000000 (8 桁) を検証することもわかります。

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;
}

2 番目の正規表現は日付を一致させようとしており、最初の正規表現はピリオドをエスケープする必要がありました。00000000あなたが言ったように、避けるためにいくつかの範囲を変更しました。

それ以外では、3 つすべてがエラーを発生させるのに失敗する必要があるため、行頭のアンカーを誤って配置し、||代わりに使用しました。&&

于 2013-09-07T19:30:03.747 に答える