我有一个像这样的格式的字符串:
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,而不仅仅是最后一个。这甚至可以使用正则表达式,还是我需要使用另一种方法来验证并从这些字符串中获取值?
答案 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;
}