假设我们有这个正则表达式:
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';
}
我想知道是否还有其他办法!
答案 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.php和http://php.net/manual/en/function.preg-match-all.php,示例3