2012-12-07 48 views
0

给定一个URL路径,我试图创建一个正则表达式来匹配,如果路径指向一个目录,并且不匹配,如果它指向文件扩展名.php,.js,.html ,热媒等PHP正则表达式匹配文件或目录

比赛:

/www/site/path/ny/ 

比赛:

/www/news/state.208/ii 

不匹配:

/www/news/index.php 

不匹配:

/www/site/fr/post.py 

这里是我的正则表达式,我一直在与:

^([a-zA-Z0-9/_\-]*[^/])$ 

此正则表达式我想要做什么,但不够精确。它假设它是一个文件的路径,并在遇到“。”时停止匹配,但我需要考虑目录名包含“。”的可能性,如上例所示。

我也使用负看屁股,没有运气尝试:

^(.(?!\.php)|(?!\.htm?l)|(?!\.js))$ 
+0

你的意思是*期间*? – j0k

+0

一段时间是'句号'或'。' – refugene

+1

你还没有指定你正在使用的是什么,但PHP在这方面有很多内置函数 - php的'file_exists()','is_dir()','pathinfo()','basename() '和其他函数可能比复杂的正则表达式更合适。 – SDC

回答

2

试试这个小小的一个:

^.*/[^\.]*$ 

编辑:

^.*/((?!\.js|\.php|\.html).)*$ 

更换或要忽略扩展延伸。

+0

这几乎可以工作,除非它不匹配目录:“/www/ww.news4”。 –

+0

@deraad:请参阅编辑。因为您告诉您想要忽略“文件扩展名”,使用正则表达式实现它的唯一方法是定义不需要的扩展名列表。 –

+0

很好很简单的答案! – silly

1

为了简化你的问题,你正在寻找一个字符串开头/,和最后一段不具有扩展名:

[\/]{0,1}.*\/[^\.]*.{1}$ 

编辑:

这适用于所有的例子:

^(.*\/){0,1}[^\.]*.{1}$ 
+0

它不一定必须以'/'开头。它可能也可能不会。为了简化它,应查找包含以下内容的字符串:a-zA-Z0-9 /_\.-并且不以文件扩展名结尾。 –

+0

[^ \。] *。{1} $这一个然后 –

+0

感谢您的编辑,但它似乎仍然匹配“www/fr/this.php”,我试图让它不匹配时是最后的文件扩展名。 –

2

由于您使用PHP,你可能会想尝试pathinfo代替:

$parts = pathinfo('/www/site/path/file.php'); 

在这种情况下$parts['extension']会存在,在其他情况下,它不会。

+0

好主意,除了我需要这个是因为各种原因的正则表达式 –

+0

@deraad - 如果你解释这些'各种各样的原因',它可能会帮助你获得有用的答案。从目前为止你所说的话来看,正则表达式听起来并不是合适的解决方案。 – SDC

+0

@SDC我需要它的正则表达式,因为它不仅在PHP函数中,而且在htaccess文件中。如果我只是在我的PHP脚本中使用它,我会使用PHP函数,如pathinfo() –