PHP正则表达式。如何获得一系列比赛?

时间:2013-02-21 16:47:55

标签: php regex

我有一个像这样的格式的字符串:

5;1-x;1-2;(1-x;)+

我使用1-x作为从1到无穷大和(1-x;)+的所有整数的符号,以标记最后一个整数可以重复任意次。

一些示例字符串:

5;1;1;1
5;7;2;7;5;1;9

如何将这些字符串与正则表达式匹配并获取所有(1-x;)+匹配?

我尝试了以下内容:

preg_match_all('%5;([1-9]{1}[0-9]*);([1-2]);([1-9]{1}[0-9]*;?)+%',
               $str, $matches);

字符串“5; 1; 1; 1”的结果是:

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(7) "5;1;1;1"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [3]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
}

对于字符串“5; 7; 2; 7; 5; 1; 9”,它是:

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(13) "5;7;2;7;5;1;9"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "7"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
  [3]=>
  array(1) {
    [0]=>
    string(1) "9"
  }
}

如您所见,只有(1-x;)+中的最后一个整数位于matches数组中,但我希望matches数组包含值7,5,1和9,而不仅仅是最后一个。这甚至可以使用正则表达式,还是我需要使用另一种方法来验证并从这些字符串中获取值?

2 个答案:

答案 0 :(得分:2)

单程

//$str = "5;1;1;1";
$str = "5;7;2;7;5;1;9";
$pattern = '%^5;([1-9]\d*;)[12];((?:[1-9]\d*;?)+)$%';

$str = preg_replace( $pattern, '$1$2', $str, -1, $count );

if ( $count ) {
   print_r( explode( ';', $str ) );
} else {
   echo 'Invalid string';
}

-1表示替换次数没有限制 $count是替换次数。如果字符串有效,则为1,否则为0

以上假设字符串在;结束时仍然有效。

答案 1 :(得分:0)

老实说,我只是将字符串分解并删除不需要的第一个和第三个元素:

$array = explode(';', $string);
$diff_array = array(0 => 'not_used', 2 => 'not_used');
$final_array = array_key_diff($array, $diff_array);

这将为您提供除第一个和第三个元素之外的所有值的数组,这些元素是您似乎不感兴趣的元素。

如果您需要验证其余元素是否确实是值> gt的整数,您可以像这样运行array_filter:

$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
相关问题