假设我有一个网址:https://somesite.com/0/posts/20/290/755653-Title.html
我将如何获得这些变量:/0/, /20/, /290/
?请注意,它们是变量,它们将始终是不同的。
我认为我可以像这样得到它们:
$url = '//somesite.com/0/posts/20/290/755653-Title.html';
var_dump(parse_url($url));
,但数组未将它们显示为单独的变量。应该用preg_replace
代替吗?我不知道我怎么知道。谢谢您的帮助。
答案 0 :(得分:2)
一种选择是对preg_match_all使用正向先行,在其中捕获捕获组中的模式:
(?=(/\d+/))
这将匹配
(?=
正向前进,断言右边直接是
(/\d+/)
匹配/
,1个以上的数字和/
)
积极回望例如
$re = '~(?=(/\d+/))~m';
$str = 'https://somesite.com/0/posts/20/290/755653-Title.html';
preg_match_all($re, $str, $matches);
print_r($matches[1]);
结果
Array
(
[0] => /0/
[1] => /20/
[2] => /290/
)
如果您只想获取数字而不用斜杠括起来,则可以仅在数字周围添加组
(?=/(\d+)/)
答案 1 :(得分:1)
您可以使用explode()并将字符串转换成由“ /”定界符分隔的数组。
<?php
// Example 1
$url = "https://somesite.com/0/posts/20/290/755653-Title.html";
$pieces = explode("/", $url);
echo $pieces[0] . "<br />";
echo $pieces[1] . "<br />";
echo $pieces[2] . "<br />";
echo $pieces[3] . "<br />";
echo $pieces[4] . "<br />";
echo $pieces[5] . "<br />";
echo $pieces[5] . "<br />";
echo $pieces[6] . "<br />";
echo $pieces[7] . "<br />";
echo "<hr />";
// Example 2
$data = "https://somesite.com/0/posts/20/290/755653-Title.html";
list($first, $second, $third, $fourth, $fifth, $sixth, $seventh, $eighth) = explode("/", $url);
echo $first . "<br />";
echo $second . "<br />";
echo $third . "<br />";
echo $fourth . "<br />";
echo $fifth . "<br />";
echo $sixth . "<br />";
echo $seventh . "<br />";
echo $eighth . "<br />";
?>
输出:
https:
somesite.com
0
posts
20
20
290
755653-Title.html
https:
somesite.com
0
posts
20
290
755653-Title.html
答案 2 :(得分:1)
我们可以尝试在路径分隔符上进行拆分,然后将array_filter
与内联函数一起使用以仅保留纯数字分量:
$str = 'https://somesite.com/0/posts/20/290/755653-Title.html';
$parts = explode("/", $str);
$parts = array_filter($parts, function($item) { return is_numeric($item); });
print_r($parts);
此打印:
Array
(
[3] => 0
[5] => 20
[6] => 290
)
请注意,这种方法完全避免使用正式的正则表达式,如果您需要经常在脚本中执行此操作,则可能会对性能产生影响。