preg_match() 匹配具有一种模式的案例?

preg_match() match to cases with one pattern?

我将如何根据数组的每个部分使用 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 语句无法解决此问题。

谢谢。

您可以将替代项与 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
}

甚至没有任何循环、切换或其他任何东西(比接受的答案的解决方案更快、更有效)也是可能的。

<?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];
  }
}

正则表达式很不错,但没有万能的灵丹妙药