如何使用preg_match()根据数组的每个部分开始将1个数组排列成2个数组?
我知道如何使用1表达式执行此操作,但我不知道如何使用2个表达式。 到目前为止我可以做到(不要问我为什么不使用strpos() - 我需要使用正则表达式):
$gen = array(
'F1',
'BBC450',
'BBC566',
'F2',
'F31',
'SOMETHING123',
'SOMETHING456'
);
$f = array();
$bbc = array();
foreach($gen as $part) {
if(preg_match('/^F/', $part)) {
// Add to F array
array_push($f, $part);
} else if(preg_match('/^BBC/', $part)) {
// Add to BBC array
array_push($bbc, $part);
} else {
// Not F or BBC
}
}
所以我的问题是:是否可以使用1 preg_match()函数执行此操作? 请忽略数组中的SOMETHING部分,这表明只使用一个if else语句就无法解决这个问题。
感谢。
答案 0 :(得分:3)
您可以使用替换以及preg_match
的第三个参数,其中包含匹配的正则表达式部分。
preg_match('/^(?:F|BBC)/', $part, $match);
switch ($match) {
case 'F':
$f[] = $part;
break;
case 'BBC':
$bbc[] = $part;
break;
default:
// Not F or BBC
}
答案 1 :(得分:1)
甚至可以没有任何循环,切换或其他任何东西(这比接受的答案的解决方案更快,更有效)。
<?php
preg_match_all("/(?:(^F.*$)|(^BBC.*$))/m", implode(PHP_EOL, $gen), $matches);
$f = isset($matches[1]) ? $matches[1] : array();
$bbc = isset($matches[2]) ? $matches[2] : array();
您可以找到我为您创建的regex101.com正则表达式的交互式说明。
(不需要)strpos
方法几乎快五倍。
<?php
$c = count($gen);
$f = $bbc = array();
for ($i = 0; $i < $c; ++$i) {
if (strpos($gen[$i], "F") === 0) {
$f[] = $gen[$i];
}
elseif (strpos($gen[$i], "BBC") === 0) {
$bbc[] = $gen[$i];
}
}
正则表达式很好,但对于一切都没有银弹。