为了账号安全,请及时绑定邮箱和手机立即绑定

preg_match 从字符串返回多个值

preg_match 从字符串返回多个值

PHP
繁星coding 2021-12-03 15:05:12
我想从一些 URL 中提取两个值。示例网址:cricket-ck-game-playhand-ball-hb-game-playvolley-ball-vb-game-playsoccer-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"  }
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-12-03
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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

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

演示 1

或者

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

演示 2


查看完整回答
反对 回复 2021-12-03
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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

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

解释

  • \b 词界

  • (捕获组 1

    • \w{3,} 匹配一个单词字符 3 次以上

    • (?:-\w{3,})*重复 0+ 次匹配-和 3 个或更多单词字符

  • ) 亲密团体

  • (捕获组 2

    • [a-zA-Z]{2} 匹配单词字符 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

)


查看完整回答
反对 回复 2021-12-03
  • 3 回答
  • 0 关注
  • 232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信