正则表达式获取当前页面或目录名称?

时间:2010-04-28 21:33:20

标签: php regex

我正在尝试从网址

获取网页或最后一个目录名称

例如,如果网址为: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中测试了相同的正则表达式并且它有效!)

那我在这里做错了什么,我怎么得到我想要的东西?

感谢!!!

8 个答案:

答案 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及更高版本。