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];
}
}
正则表达式很不错,但没有万能的灵丹妙药。
我将如何根据数组的每个部分使用 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];
}
}
正则表达式很不错,但没有万能的灵丹妙药。