PHP正则表达式。如何获取匹配数组?

PHP正则表达式。如何获取匹配数组?,php,regex,Php,Regex,我有一个如下格式的字符串: 5;1-x;1-2;(1-x;)+ $array = explode(';', $string); $diff_array = array(0 => 'not_used', 2 => 'not_used'); $final_array = array_key_diff($array, $diff_array); $filtered_array = array_filter($final_array, function($value) { if

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

5;1-x;1-2;(1-x;)+
$array = explode(';', $string);
$diff_array = array(0 => 'not_used', 2 => 'not_used');
$final_array = array_key_diff($array, $diff_array);
$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
我使用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”的结果是:

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


如您所见,matches数组中只有(1-x;)+中的最后一个整数,但我希望matches数组包含值7、5、1和9,而不仅仅是最后一个。使用regex是否可能实现这一点,或者我是否需要使用另一种方法来验证并从这些字符串中获取值?

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

5;1-x;1-2;(1-x;)+
$array = explode(';', $string);
$diff_array = array(0 => 'not_used', 2 => 'not_used');
$final_array = array_key_diff($array, $diff_array);
$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
这将为您提供一个包含所有值的数组,但第一个和第三个元素除外,它们是您似乎不感兴趣的元素

如果随后需要验证其余元素是否确实是值>=1的整数,则可以对其运行数组过滤器,如下所示:

5;1-x;1-2;(1-x;)+
$array = explode(';', $string);
$diff_array = array(0 => 'not_used', 2 => 'not_used');
$final_array = array_key_diff($array, $diff_array);
$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
单程

//$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-4;1-x;1-3;1-x”的字符串以前,所以我想我会扩展它。如果无法将这些值放入matches数组,我想我将使用我已经编写的正则表达式来验证字符串的格式是否正确,然后使用它来获取整数值。啊,我明白了,验证。子模式的数量不能可变。如果子模式上有一个量词,则每个匹配项都将替换最后一个,因此其最终值将仅包含其最后一个匹配项(如您所见)。