6

我不太擅长找到正确的正则表达式自动化来生成不同的表达式,但是当涉及到 PHP 中的脚本时,这让我很头疼。我无法证明自己能够在 preg_match 中编写一个“适合”表达式的模式,例如:123-23-345...123-34-456....12-234-56.....应该是3组数字,其中每组,个体从左到右排序,并且每个下一组没有一个数字大于前一组的最大数字。这:123-23-456 是错误的,因为 23 中的 2 小于 123 中的 3。123-43-45 再次错误,因为 43 应该是 34...

这应该可以帮助我验证可能只有该类型内容的字段。它应该是一个正则表达式验证,而不是一个用于解析、拆分的函数......

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 回答