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

正则表达式很好,但并不是所有事情的灵丹妙药