PHP - preg_match - 为匹配的元素分配任意值

时间:2010-12-01 17:16:48

标签: php regex preg-match pipe

假设我们有这个正则表达式:

preg_match('/\b(xbox|xbox360|360|pc|ps3|wii)\b/i' , $string, $matches);

现在,每当正则表达式匹配前。 三种xbox方法中的一种(xbox | xbox360 | 360)$matches,应仅返回 XBOX

这可能继续在preg_match()上下文中工作,或者我应该使用其他方法吗?

提前谢谢。

编辑:

实际上我是这样做的:

$x = array('xbox360','xbox','360');
if( preg_match('/\b(xbox360|xbox|360|pc|ps3)\b/i', $s, $m ) ) {
  $t = $m[0];
}
if ( in_array($t,$x) ) {
  $t = 'XBOX';
}

我想知道是否还有其他办法!

1 个答案:

答案 0 :(得分:2)

你当前的代码对我来说没问题,如果你想要它有点发烧友,你可以尝试命名子模式

preg_match('/\b((?P<XBOX>xbox|xbox360|360)|pc|ps3|wii)\b/i' , $string, $matches);
$t = isset($matches['XBOX']) ? 'XBOX' : $matches[0];
在匹配之前

或preg_replac'ing事物:

$string = preg_replace('~\b(xbox|xbox360|360)\b~', 'XBOX', $string);
preg_match('/\b(XBOX|pc|ps3|wii)\b/i' , $string, $matches);

关于大输入我想你的方法将是最快的。一个小的改进是用基于散列的查找替换in_array

$x = array('xbox360' => 1,'xbox' => 1,'360' => 1);
if( preg_match('/\b(xbox360|xbox|360|pc|ps3)\b/i', $s, $m ) ) {
  $t = $m[0];
}
if ( isset($x[$t] ) {
  $t = 'XBOX';
}

命名子模式:请参阅http://www.php.net/manual/en/regexp.reference.subpatterns.phphttp://php.net/manual/en/function.preg-match-all.php,示例3