正则表达式:如何验证路径不包含//

时间:2010-09-28 13:45:08

标签: php javascript regex path

我需要帮助来创建一个正则表达式(用于JavaScript .match和PHP preg_match),它验证文件的unix类型绝对路径(使用国际字符,例如åäöøæð等),以便:

  1. / path / to / someWhere是有效的
  2. / path/tø/sömewhere有效
  3. / path / to //某处无效
  4. path / to / somewhere 无效
  5. / path / to / somewhere / 无效
  6. 正则表达式需要处理路径,无论其深度如何(/ path / to或/ path / to / somewhere或/ path / to / somewhere / else)

    我有一个正则表达式,将1到3标记为有效/^ \ /。+ [^ \ / $ $ /,问题是使此正则表达式不将3标记为有效,因为它包含//没有任何其他字符介于两者之间。

6 个答案:

答案 0 :(得分:4)

这里并不真正需要正则表达式。据我所知,您需要确保三件事:

  1. 字符串以/
  2. 开头
  3. 该字符串不以/结尾,除非整个字符串 /
  4. 该字符串不包含//
  5. 的任何实例

    以上所有三个都可以用字符串函数完成。

    在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)