Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match从字符串返回多个值_Php_Regex_Preg Match_Preg Match All - Fatal编程技术网

Php preg_match从字符串返回多个值

Php preg_match从字符串返回多个值,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我想从一些URL中提取两个值 示例URL: 板球比赛 手球hb游戏 截击球vb游戏玩法 足球sc游戏玩法 我想分别提取游戏全名及其短名,忽略URL末尾的-游戏玩法部分 我尝试了以下返回“ck”、“hb”、“vb”、“sc”的代码,但没有返回全名 preg_match("/(?<=-)[^-]*(?=-game-play)/", $uri, $game); 预期成果: case:1 (In case of example 1) - array(2) { [0]=> st

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

示例URL:

  • 板球比赛
  • 手球hb游戏
  • 截击球vb游戏玩法
  • 足球sc游戏玩法
我想分别提取游戏全名及其短名,忽略URL末尾的
-游戏玩法
部分

我尝试了以下返回“ck”、“hb”、“vb”、“sc”的代码,但没有返回全名

preg_match("/(?<=-)[^-]*(?=-game-play)/", $uri, $game);
预期成果:

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"  
}

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

也许,这个表达式可能与您的想法有些接近:

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


如果短名称前的部分始终超过3个字符,且短名称始终由2个字符组成,则可以使用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}
      匹配两次单词字符(根据注释)
  • 关闭组
  • -游戏玩法
    逐字匹配
  • \b
    单词边界
|

另一个选项是在捕获组中使用并拆分由连字符包围的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
)

不会产生所需的输出。游戏名称可以有连字符。@Emma谢谢!你的条件1非常有效!这些都是有效的,但你不需要向前看<代码>(.*)-(.*)-游戏玩法非常优雅。
ck
etc前面的部分总是超过2个字符吗?短名称总是2个字符吗?它们总是a-z字符吗?是的,“ck”之前的部分总是超过2个字符,而且短名称总是2个字符,并且总是字母表(有时可以是大写字母或Uc字母),谢谢!它在任何条件下都能完美工作。
\b(\w{3,}(?:-(?:\w{3,}))*)-(\w{2})-game-play\b
$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
)