【问题标题】:preg_match to return multiple values from stringpreg_match 从字符串返回多个值
【发布时间】:2019-12-28 02:41:12
【问题描述】:

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

示例网址:

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

我想分别提取游戏全名及其短名,忽略网址末尾的-game-play部分。

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

【问题讨论】:

  • ck 等之前的部分是否总是超过 2 个字符,短名称是否总是 2 个字符?他们总是字符 a-z 吗?
  • 是的,'ck' 之前的部分总是超过 2 个字符,而且短名称总是 2 个字符并且总是只有字母(有时可以是大写字母或 Uc 之类的)

标签: php regex preg-match preg-match-all


【解决方案1】:
preg_match("/(.+)-([a-z]{2})-/i", $uri, $game);

抓取两个用短划线包围的字母之前的所有内容,然后抓取这两个字母。

【讨论】:

  • 非常感谢!它在任何条件下都能完美运行。
【解决方案2】:

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

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

Demo 1

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

Demo 2

【讨论】:

  • 不会产生所需的输出。游戏名称中可以有连字符。
  • @Emma 谢谢!你的条件 1 就像一个魅力!
  • 这些工作,但您不需要前瞻。 (.*)-(.*)-game-play 非常优雅。
【解决方案3】:

如果短名称之前的部分总是超过 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 次(根据 cmets)
  • )关闭群
  • -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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2020-10-06
    • 2020-10-23
    • 2015-12-18
    • 2014-11-30
    • 2017-08-20
    • 2014-04-22
    相关资源
    最近更新 更多