我需要帮助来创建一个正则表达式(用于JavaScript .match和PHP preg_match),它验证文件的unix类型绝对路径(使用国际字符,例如åäöøæð等),以便:
正则表达式需要处理路径,无论其深度如何(/ path / to或/ path / to / somewhere或/ path / to / somewhere / else)
我有一个正则表达式,将1到3标记为有效/^ \ /。+ [^ \ / $ $ /,问题是使此正则表达式不将3标记为有效,因为它包含//没有任何其他字符介于两者之间。
答案 0 :(得分:4)
这里并不真正需要正则表达式。据我所知,您需要确保三件事:
/
/
结尾,除非整个字符串 /
//
以上所有三个都可以用字符串函数完成。
在PHP中:
if ($string != '/' && ($string[0] != '/' || $string[strlen($string)-1] == '/' || strpos($string, '//') > -1))
{
// string is invalid
}
在Javascript中:
if (string != '/' && (string.charAt(0) != '/' || string.charAt(string.length - 1) == '/' || string.indexOf('//') > -1))
{
// string is invalid
}
资源:
答案 1 :(得分:2)
PHP的解决方案:
$lines = array(
"/path/to/someWhere",
"/path/tø/sömewhere",
"/path/to//somewhere",
"path/to/somewhere",
"/path/to/somewhere/",
);
foreach($lines as $line){
var_dump(preg_match('#^(/[^/]+)+$#',$line)); // dumps int(1) int(1) int(0) int(0) int(0)
}
答案 2 :(得分:1)
我认为这样做会:
^(:?\/$|(:?\/[^/]+)+$)
这表示接受任何只是 a /的字符串,或者由a /的一个或多个重复序列形成的任何字符串,后跟一个或多个非/字符。
这使用了所有贪婪的量词,所以它应该很快;另外,为了表现,^锚被解决了。
这是一个Javascript正则表达式。我不是PHP程序员,所以我不知道的主要问题是非捕获组语法是否适用于PHP。另外,我不确定你如何处理“引用”斜线字符。
答案 3 :(得分:0)
这应该有效:
^/[^/]?$|^/[^/]([^/]|/[^/])*?[^/]$
它允许除/
,或之外的任何字符/
后跟除/
之外的任何字符。它还确保最后一个字符不是/
,第二个字符也不是。
最后,这会使用/
而不会转义。要在PHP中使用它,不要使用/
作为正则表达式分隔符 - 这只会使正则表达式难以阅读。使用任何其他字符,例如;
来分隔表达式:
;^/[^/]?$|^/[^/]([^/]|/[^/])*?[^/]$;
编辑:为根路径"/"
添加了特殊处理,以及由单个字母目录组成的路径。
答案 4 :(得分:0)
如果路径与^[^\/]|\/\/|.\/$
匹配,则无效。否则它是有效的。
答案 5 :(得分:0)
它不是正则表达式,但效果也一样。
str_replace('//', '/', $file)