preg_match 到 return 字符串中的多个值
preg_match to return multiple values from string
我想从一些 URL 中提取两个值。
示例 URLs:
cricket-ck-game-play
hand-ball-hb-game-play
volley-ball-vb-game-play
soccer-sc-game-play
我想分别提取 游戏全名 及其 简称 ,忽略结尾的 -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
字边界
另一种选择是使用 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
)
我想从一些 URL 中提取两个值。
示例 URLs:
cricket-ck-game-play
hand-ball-hb-game-play
volley-ball-vb-game-play
soccer-sc-game-play
我想分别提取 游戏全名 及其 简称 ,忽略结尾的 -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
字边界
另一种选择是使用 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
)