2010-04-28 102 views
2

我试图从URL正则表达式来获取当前页面或目录名称?

获取页面或最后一个目录名,例如,如果网址是: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

“但是我在ActionScript中测试了相同的正则表达式,它工作正常!”你是否手动设置了'$ url'或者是否从其他地方将它拉出来,如$ _SERVER的值之一? – Powerlord 2010-04-28 21:36:49

+0

是否要在URL的域部分之后返回整个地址? – 2010-04-28 21:39:55

+0

@OMG独角兽我手动设置网址,没有从$ _SEVER得到它 – 2010-04-29 12:52:06

回答

3

你可以尝试在中间跳过“/”。这只是关闭你的正则表达式。所以这可能工作:

$regex = "/.*\.(com|gov|org|net|mil|edu)\/([a-z_\-]+).*/i"; 

你也可能使正则表达式更普遍,但这是另一个问题。

6

如果它还包含斜杠,请不要使用/作为正则表达式分隔符。试试这个:

$regex = "#^.*\.(com|gov|org|net|mil|edu)/([a-z_\-]+).*$#i"; 
+0

+ +1为我展示了另一种方法来包装正则表达式:) – 2010-04-29 14:02:39

0

您可以使用此

array_pop(explode('/', $url)); 

然后申请一个简单的正则表达式来然后再删除任何文件扩展名

0

,看来这里的问题不在于你的正则表达式是功能不够强大,只是输入错误(在字符串中间关闭分隔符)。我将留给后代,但我强烈建议您查看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)); 
0

假设你想后,以配合整个地址域部分:

$regex = "%://[^/]+/([^?#]+)%i"; 

上面假定格式延伸的URL:// domainpart/everythingelse

0

尽管我个人喜欢使用正则表达式,但更粗俗的字符串函数可能是您的一个很好的选择。下面的代码段使用sscanf来解析第一批字母的URL的路径部分。

$url = "http://www.example.com/page.php"; 
$path = parse_url($url, PHP_URL_PATH); 
sscanf($path, '/%[a-z]', $part); 
// $part = "page"; 
+0

这有一个严重的问题,除了文件名中的字母a-z以外的任何内容都将被匹配。什么是首都,数字,符号等等? – erisco 2010-04-29 08:32:21

+0

他们呢?如果有的话,根据原始问题,字符类中唯一需要额外的东西是下划线和连字符。如果OP需要“其他的东西”,我相信他可以问问或者弄清楚自己。 – salathe 2010-04-29 12:13:10

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

0

保存你自己的正则表达式,并让PHP的其他功能感受到更多的喜爱。

$url = "http://www.example.com/page.php"; 
$filename = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_FILENAME); 

警告:对于PHP 5.2及更高版本。

+0

这有一个严重问题,即基本级别文件或文件夹名称以外的任何内容都将与之匹配。除此之外'....../page/foo.php'怎么样? – salathe 2010-04-29 12:16:38

+0

要求是“获取页面或上一个目录名称”。这意味着我们不需要整个路径,仅仅是你的例子中的“foo”。如果不是这个要求,那么这个问题就会被问到。 – erisco 2010-04-29 18:04:48