1

我有一个格式如下的字符串:

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;)+ 中的最后一个整数在匹配数组中,但我希望匹配数组包含值 7、5、1 和 9,而不仅仅是最后一个。这甚至可以使用正则表达式还是我需要使用另一种方法来验证并从这些字符串中获取值?

4

2 回答 2

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

以上假设如果字符串以;.

于 2013-02-21T17:52:46.887 回答
0

老实说,我只会分解字符串并删除不需要的第一个和第三个元素,如下所示:

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

这为您提供了一个包含所有值的数组,除了您似乎不感兴趣的第一个和第三个元素。

如果您随后需要验证剩余元素确实是值 >= 1 的整数,您可以像这样在其上运行 array_filter:

$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
于 2013-02-21T17:04:45.290 回答