php preg匹配.查找具有两个不按顺序排列的值的元素



我得到了如下数组:

$array = array(
3A32,
4565,
7890,
0012,
A324,
9002,
3200,
345A,
0436
);

然后我需要找出哪些元素有两个数字。数字的值可以更改。

如果值为:

$n1 = 0; 
$n2 = 3;

对于该搜索,preg_match()应返回(3200,0436)

如果值为:

$n1 = 0; 
$n2 = 0;

preg_match()应返回(0012,3200,9002)

知道吗?

谢谢。

我在多次查看输入数组以及基于给定数字的输出后得到了您的逻辑。

由于我根本不擅长正则表达式, 我将使用常用的PHP函数来找出答案。

1.创建一个函数,它接受初始数组以及数组形式的搜索数字(这样你就可以搜索任何数字和任何长度的数字(。

2.现在迭代初始数组,拆分每个值以转换为数组,并对拆分数组和数字数组执行array_count_value()。现在应用检查并查看是否找到完全匹配?

3.将此匹配项分配给在函数本身下声明的新数组。

4.在函数末尾返回此数组。

$n1 = 0; 
$n2 = 0;
function checkValues($array,$numbers=array()){
$finalArray = [];
if(!empty($numbers)){
foreach($array as $arr){
$splitArr = str_split($arr);
$matched = true;
$count_number_Array = array_count_values($numbers);
$count_split_array = array_count_values($splitArr);
foreach($count_number_Array as $key=>$value){
if(!isset($count_split_array[$key]) || $count_split_array[$key] < $value){
$matched = false;
break;
}
}
if($matched === true){
$finalArray[] = $arr;
}
}
}
return $finalArray;
}
print_r(checkValues($array, array($n1,$n2)));

输出:https://3v4l.org/7uWfC和https://3v4l.org/Tuu5m和https://3v4l.org/fEKTO

您可以不使用preg_match,而是使用preg_grep,并使用交替动态创建一个模式,该模式将匹配每个顺序中的2个值。

^[A-Z0-9]*0[A-Z0-9]*3[A-Z0-9]*|[A-Z0-9]*3[A-Z0-9]*0[A-Z0-9]*$

字符类[A-Z0-9]匹配字符a-Z或数字0-9。

Regex演示| Php演示

如果您想使用其他字符,也可以查看preg_quote来处理正则表达式字符。

function getElementWithTwoValues($n1, $n2) {
$pattern = "/^[A-Z0-9]*{$n1}[A-Z0-9]*{$n2}[A-Z0-9]*|[A-Z0-9]*{$n2}[A-Z0-9]*{$n1}[A-Z0-9]*$/";
$array = array(
"3A32",
"4565",
"7890",
"0012",
"A324",
"9002",
"3200",
"345A",
"0436"
);
return preg_grep($pattern, $array);
}
print_r(getElementWithTwoValues(0, 3));
print_r(getElementWithTwoValues(0, 0));

输出

Array
(
[6] => 3200
[8] => 0436
)
Array
(
[3] => 0012
[5] => 9002
[6] => 3200
)

最新更新