preg_match()匹配一个模式的案例?

时间:2015-01-11 22:27:44

标签: php regex preg-match

如何使用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语句就无法解决这个问题。

感谢。

2 个答案:

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

正则表达式很好,但对于一切都没有银弹