preg_匹配中的正则表达式和模式-PHP适合123-23-345

preg_匹配中的正则表达式和模式-PHP适合123-23-345,php,regex,preg-match,Php,Regex,Preg Match,我不太擅长寻找正则表达式的正确自动化,以生成不同的表达式,但当涉及到用PHP编写脚本时,这就成了我的一大难题。我无法证明自己能够在preg_match中编写一个“适合”表达式的模式,如:123-23-345…123-34-456…12-234-56…应该是3组数字,其中,每个组都是从左到右排序的,每个下一组的数字都不比前一组的最大数字大。这个:123-23-456是错误的,因为23分之二小于123分之三。123-43-45又错了,因为43应该是34 这将帮助我验证可能只有该类型内容的字段。它应该

我不太擅长寻找正则表达式的正确自动化,以生成不同的表达式,但当涉及到用PHP编写脚本时,这就成了我的一大难题。我无法证明自己能够在preg_match中编写一个“适合”表达式的模式,如:123-23-345…123-34-456…12-234-56…应该是3组数字,其中,每个组都是从左到右排序的,每个下一组的数字都不比前一组的最大数字大。这个:123-23-456是错误的,因为23分之二小于123分之三。123-43-45又错了,因为43应该是34


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

的函数,而不是只使用
preg\uu
函数,您还需要使用一些其他条件匹配

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


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

好吧,我认为不会有只有正则表达式的解决方案。 因此,我在这里对您需要的函数进行了编码:

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";
函数IsValidGitExpression($string){
$flag=preg_match('/^(\d+)\-(\d+)\-(\d+)$/',$string,$matches);
如果(!$flag)返回false;
//通过将数字字符串拆分为数组来检查排序是否正确

对于($i=1;$i),这不是正则表达式的理想问题。绝对不是正则表达式的工作。正则表达式是关于模式的,您要做的是语义。每个组有多长?{1,3}或者无限?我想preg_match中的模式比常规的自动化正则表达式知道的更多…我想我必须用这种方式解析它,谢谢。你能用标签向我解释一下模式,作为自动化的逻辑…/^(\S+)\(\S+)\(\S+)-(\S+)$/我知道它的功能,但不知道如何…是学习正则表达式的一个相当不错的资源。