preg_match 到 return 字符串中的多个值

preg_match to return multiple values from string

我想从一些 URL 中提取两个值。

示例 URLs:

我想分别提取 游戏全名 及其 简称 ,忽略结尾的 -game-play 部分URL.

我已经尝试了以下代码 returns 'ck'、'hb'、'vb'、'sc',但没有 全名.

preg_match("/(?<=-)[^-]*(?=-game-play)/", $uri, $game);

我得到的实际结果:

array(1) {
  [0]=>
  string(2) "ck"
}

预期结果:

case:1 (In case of example 1) -  array(2) {
  [0]=>
  string(7) "cricket"
  [1]=>
  string(2) "ck"
}

case:2 (In case of example 2) - array(2) {
  [0]=>
  string(9) "hand-ball"
  [1]=>
  string(2) "hb"  
}
preg_match("/(.+)-([a-z]{2})-/i", $uri, $game);

抓取两个带破折号的字母之前的所有内容,然后抓取这两个字母。

也许,这个表达式可能有点接近你的想法:

(.*)-(.{2})(?=-game-play)

Demo 1

(.*)-(.*)(?=-game-play)

Demo 2

如果短名称之前的部分总是超过 3 个字符,并且短名称总是由 2 个字符组成 [a-zA-Z] 您可以使用 2 个捕获组,使用量词 {3,}{2}来匹配字符。

\b(\w{3,}(?:-(?:\w{3,}))*)-(\w{2})-game-play\b

说明

  • \b字边界
  • ( 捕获 组 1
    • \w{3,} 匹配一个词 char
    • 3 次以上
    • (?:-\w{3,})* 重复 0+ 次匹配 - 和 3 个或更多单词字符
  • ) 关闭群
  • ( 捕获 第 2 组
    • [a-zA-Z]{2} 匹配 2 次一个单词字符(根据评论)
  • ) 关闭群组
  • -game-play字面匹配
  • \b字边界

Regex demo | Php demo

另一种选择是使用 preg_split 并在捕获组中拆分由连字符包围的 2 个字符 a-z 并匹配其余字符:

$pattern = "/-([a-z]{2})-.*/";
$str = "cricket-ck-game-play";
print_r(preg_split($pattern, $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

结果

Array
(
    [0] => cricket
    [1] => ck
)

Php demo