6

私は正規表現の適切な自動化を見つけて別の表現を生成するのが得意ではありませんが、これが PHP でのスクリプト作成になると、私のお尻の痛みになります。123-23-345...123-34-456....12-234-56..... のような式に「適合する」パターンを preg_match で記述できることを証明することはできません。数字の 3 つのグループであり、すべてのグループが個別に左から右に並べ替えられ、次のすべてのグループは前のグループの最大の数字よりも大きな数字を持っていません。これ: 123-23-456 は間違っています。23 分の 2 は 123 分の 3 より小さいからです。43 は 34 であるべきなので、123-43-45 も間違っています...

これは、そのタイプのコンテンツのみを持つ可能性のあるフィールドを検証するのに役立ちます。解析、分割のための関数ではなく、正規表現の検証である必要があります...

4

2 に答える 2

2

まあ、正規表現のみの解決策はないと思います。したがって、ここで必要な関数をコーディングしました。

function isValidDigitExpression($string) {
    $flag = preg_match('/^(\d+)\-(\d+)\-(\d+)$/', $string, $matches);
    if (!$flag) return false;

    // Check correct sorting by splitting digit string to array
    for ($i = 1; $i <= 3; $i++ ) {
         $block[$i] = str_split($matches[$i]);
         $compare = $block[$i];
         sort($compare);
         if ($compare != $block[$i]) return false;
    }

    // Compare Min and Max digits of neighboring digit blocks
    return (max($block[1]) <= min($block[2]) and max($block[2]) <= min($block[3]));
}

$string = "123-34-356"; // Failure, because 3 < 4 comparing Block 2 and Block 3
echo isValidDigitExpression($string) ? "SUCCESS" : "FAILURE";
于 2013-03-18T12:25:54.153 に答える
1

関数だけを使用する代わりに、preg_他の条件マッチングも使用する必要があります。

<?php
  $str = "123-34-456";
  preg_match( "/^.*?(\d)\-(\d).*?(\d)\-(\d)/", $str, $matches );
  $flag = true;
  if( $matches[2] < $matches[1] )
      $flag = false;
  if( $matches[4] < $matches[3] )
      $flag = false;
  echo ( !$flag ) ? "ERROR" : "NO ERROR";
?>

同様に、それぞれのセクションの数値を一致させ、すべてのリテラルを反復処理し、値が一致しない場合はフラグを再度使用できます。

このようなもの:

<?php
  $str = "132-34-456";
  preg_match( "/^(\S+)\-(\S+)\-(\S+)$/", $str, $matches );
  $flag = true;
  for( $i = 0; $i < strlen($matches[1]) - 1; $i++ ) {
      if( $matches[1][$i+1] < $matches[1][$i] ) {
          $flag = false;
          break;
      }
  }
  for( $i = 0; $i < strlen($matches[2]) - 1; $i++ ) {
      if( $matches[2][$i+1] < $matches[2][$i] ) {
          $flag = false;
          break;
      }
  }
  for( $i = 0; $i < strlen($matches[3]) - 1; $i++ ) {
      if( $matches[3][$i+1] < $matches[3][$i] ) {
          $flag = false;
          break;
      }
  }
  echo ( !$flag ) ? "ERROR" : "NO ERROR";
?>

明らかに、これはソリューションの中で最良/最適化されたものではありません。

于 2013-03-18T06:55:58.027 に答える