PHP - preg_match - назначить произвольное значение сопоставляемому элементу - PullRequest
1 голос
/ 01 декабря 2010

при условии, что у нас есть это регулярное выражение:

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

сейчас, всякий раз, когда регулярное выражение соответствует ex. один из трех методов 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 Ответ

2 голосов
/ 01 декабря 2010

Ваш текущий код выглядит нормально для меня, если вы хотите, чтобы он был немного изящнее, вы можете попробовать именованные подшаблоны

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 перед тем, как сопоставить:на больших входах, я думаю, ваш метод будет самым быстрым.Незначительным улучшением будет замена 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

...