2

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

示例网址:

  • cricket-ck-game-play
  • hand-ball-hb-game-play
  • volley-ball-vb-game-play
  • soccer-sc-game-play

我想分别提取完整的游戏名称及其短名称,忽略-game-playURL 末尾的部分。

我尝试了以下代码,它返回 '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"  
}
4

3 回答 3

2
preg_match("/(.+)-([a-z]{2})-/i", $uri, $game);

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

于 2019-08-22T18:30:59.293 回答
1

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

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

演示 1

或者

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

演示 2

于 2019-08-22T18:34:41.623 回答
1

如果短名称之前的部分总是超过 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}匹配一个单词 char 2 次(根据评论)
  • )关闭组
  • -game-play从字面上匹配
  • \b字边界

正则表达式演示| php演示

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

$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演示

于 2019-08-22T19:13:04.973 回答