【问题标题】:Regex and pattern in a preg_match - PHP to fit 123-23-345preg_match 中的正则表达式和模式 - PHP 适合 123-23-345
【发布时间】:2013-03-18 06:26:08
【问题描述】:

我不太擅长找到正确的正则表达式自动化来生成不同的表达式,但是当涉及到 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...

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

【问题讨论】:

  • 这对于正则表达式来说并不是一个理想的问题。
  • 绝对不是正则表达式工作。正则表达式是关于模式的,你想做的涉及语义。
  • 每组多长时间? {1,3} 或无限?

标签: php regex preg-match


【解决方案1】:

好吧,我认为不会有纯正则表达式的解决方案。 所以在这里我编写了你需要的函数:

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

【讨论】:

    【解决方案2】:

    除了使用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";
    ?>
    

    显然,这不是最佳/最优化的解决方案。

    【讨论】:

    • 我认为 preg_match 中的模式比常规的自动化正则表达式更了解......我想我必须这样解析它,谢谢。您能否按标签向我解释模式作为自动化逻辑... .
    • regular-expressions.info 是学习正则表达式的不错资源。
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2013-04-05
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多