我正在尝试从网址
获取网页或最后一个目录名称例如,如果网址为:http://www.example.com/dir/
我希望它返回dir
,或者传递的网址是http://www.example.com/page.php
我希望它返回page
请注意我不知道想要尾随斜杠或文件扩展名。
我试过了:
$regex = "/.*\.(com|gov|org|net|mil|edu)/([a-z_\-]+).*/i";
$name = strtolower(preg_replace($regex,"$2",$url));
我在PHP中运行此正则表达式并且它什么也没有返回。 (但我在ActionScript中测试了相同的正则表达式并且它有效!)
那我在这里做错了什么,我怎么得到我想要的东西?
感谢!!!
答案 0 :(得分:6)
如果它还包含斜杠,请不要使用/
作为正则表达式分隔符。试试这个:
$regex = "#^.*\.(com|gov|org|net|mil|edu)/([a-z_\-]+).*$#i";
答案 1 :(得分:3)
你可以尝试逃避中间的“/”。这只是关闭你的正则表达式。所以这可行:
$regex = "/.*\.(com|gov|org|net|mil|edu)\/([a-z_\-]+).*/i";
你也可以使正则表达式更加通用,但这是另一个问题。
答案 2 :(得分:0)
您可以使用此
array_pop(explode('/', $url));
然后应用简单的正则表达式删除任何文件扩展名
答案 3 :(得分:0)
然后,似乎问题不在于你的RegEx不够强大,只是错误输入(在字符串中间关闭分隔符)。我将把它留给后代,但我强烈建议您查看PHP的parse_url()
方法。
这应该足以提供:
substr($s = basename($_SERVER['REQUEST_URI']), 0, strrpos($s,'.') ?: strlen($s))
但这更好:
preg_replace('/[#\.\?].*/','',basename($path));
虽然,你的例子很简短,但我不知道你是想保留整个路径还是只保留它的最后一个元素。前面的例子只保留最后一个部分,但这应该保存整个路径,同时通用性足以处理几乎任何可以抛出的东西:
preg_replace('~(?:/$|[#\.\?].*)~','',substr(parse_url($path, PHP_URL_PATH),1));
答案 4 :(得分:0)
假设您想要在域部分之后匹配整个地址:
$regex = "%://[^/]+/([^?#]+)%i";
以上假设格式 扩展程序 :// domainpart / everythingelse < / em>的
答案 5 :(得分:0)
尽管我个人喜欢使用正则表达式,但更多“粗略”(因为缺少更好的词)字符串函数可能是一个很好的选择。下面的代码段使用sscanf
来解析第一串字母的网址路径部分。
$url = "http://www.example.com/page.php";
$path = parse_url($url, PHP_URL_PATH);
sscanf($path, '/%[a-z]', $part);
// $part = "page";
答案 6 :(得分:0)
这个表达式:
(?<=^[^:]+://[^.]+(?:\.[^.]+)*/)[^/]*(?=\.[^.]+$|/$)
给出以下结果:
http://www.example.com/dir/ dir
http://www.example.com/foo/dir/ dir
http://www.example.com/page.php page
http://www.example.com/foo/page.php page
如果这不是有效的PHP正则表达式,请提前道歉 - 我使用RegexBuddy对其进行了测试。
答案 7 :(得分:0)
保存正则表达式,让PHP的其他功能更受欢迎。
$url = "http://www.example.com/page.php";
$filename = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_FILENAME);
警告:对于PHP 5.2及更高版本。