2010-01-08 26 views
6

encontrar una expresión regular para JavaScript que pondrá a prueba en los siguientes casos:expresión regular para la validación de la ruta del archivo en javascript Me parece que no puede

  • c: \ temp
  • D: \ directorio '\ prueba \
  • \ john-escritorio \ tempdir \

Se puede ver lo que voy a. Solo necesito validar una ruta de archivo. Pero parece que todas las expresiones que he encontrado no funcionan para JavaScript.

+0

Qué haría usted hacer con una ruta de archivo en JS? Normalmente, JS no tiene acceso al sistema de archivos del disco local. Enviar la ruta del archivo al lado del servidor tampoco tendría mucho sentido ya que el servidor no tiene acceso al sistema de archivos del disco local del cliente.Después de todo, creo que solo necesitas 'input type =" file "' y no te preocupes por la validación. – BalusC

+1

BalusC, entiendo esto. La aplicación que estoy creando se ocupa de un servidor de base de datos que tiene filepaths como uno de sus campos. Para que se pueda editar, me gustaría tener alguna validación. A pesar de que el usuario podría poner en una ruta no válida, al menos esto ayudará a asegurarse de que el usuario ingrese una ruta. Además, esta es una ruta del lado del servidor, por lo que input type = "file" no funcionará. Gracias. – postalservice14

Respuesta

2

Prueba esto:

([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\\? 

EDIT:

@Bart me hizo pensar acerca de esta expresión regular. Este debería funcionar bien para los caminos de Windows.

^([a-zA-Z]:)?(\\[^<>:"/\\|?*]+)+\\?$ 
+0

Eso coincide con una cadena vacía también. También tenga en cuenta que las carpetas en Windows pueden tener más que el conjunto '[a-zA-Z0-9 _-]' en ellas. –

+0

+1 porque me siento mejor cuando veo a alguien más que escribe expresiones regulares como minas; Soy "normal" después de todo –

+0

@Bart Tienes razón, gracias. Lo arreglaré. Nota: lo sé pero es simplemente editable. Escribí base regex - la idea es clara – Gaim

0

Se podría comenzar con:

^([a-zA-Z]:)?(\\[a-zA-Z0-9_\-]+)+\\? 

Esto coincide con todas sus muestras.

+0

¿funciona esto para php? – eronax59

1

creo que esto va a funcionar:

var reg = new RegExp("^(?>[a-z]:)?(?>\\|/)?([^\\/?%*:|\"<>\r\n]+(?>\\|/)?)+$", "i"); 

acabo excluyen todos (?) caracteres no válidos en los nombres de archivo. Debería funcionar con nombres de archivos internacionales (no sé), así como con cualquier tipo de ruta de sistema operativo (con las excepciones que se indican a continuación).

+0

Lo sentimos, pero algunos de sus caracteres excluidos están permitidos, por ejemplo '% []' – Gaim

+0

% se definió en la página wiki que vinculaba como un comodín en un sistema, por lo tanto, por compatibilidad, no estaba permitido. Sin embargo, he actualizado para eliminar [] de la lista de rechazo. –

+0

@Kevin Estoy usando Linux Ubuntu (Jaunty) y% de caracteres permitidos. Así que puedo tener un archivo que no coincida con su expresión regular (lo sé, el uso de los caracteres allí es feo, pero no sabemos nada sobre los futuros clientes) – Gaim

4

Aquí está la validación de ruta de Windows, funciona bien para todas las reglas de ruta de Windows.

var contPathWin = document.editConf.containerPathWin.value; 

if(contPathWin=="" || !windowsPathValidation(contPathWin)) 
{ 
    alert("please enter valid path"); 
    return false; 
} 

function windowsPathValidation(contwinpath) 
{ 
    if((contwinpath.charAt(0) != "\\" || contwinpath.charAt(1) != "\\") || (contwinpath.charAt(0) != "/" || contwinpath.charAt(1) != "/")) 
    { 
     if(!contwinpath.charAt(0).match(/^[a-zA-Z]/)) 
     { 
      return false; 
     } 
     if(!contwinpath.charAt(1).match(/^[:]/) || !contwinpath.charAt(2).match(/^[\/\\]/)) 
     { 
      return false; 
     } 

} 

y esto es para la validación de la ruta de linux.

var contPathLinux = document.addSvmEncryption.containerPathLinux.value; 

if(contPathLinux=="" || !linuxPathValidation(contPathLinux)) 
{ 
    alert("please enter valid path"); 
    return false; 
} 

function linuxPathValidation(contPathLinux) 
{ 
    for(var k=0;k<contPathLinux.length;k++){ 
     if(contPathLinux.charAt(k).match(/^[\\]$/)){ 
      return false; 
     } 
    } 
    if(contPathLinux.charAt(0) != "/") 
    { 
     return false; 
    } 
    if(contPathLinux.charAt(0) == "/" && contPathLinux.charAt(1) == "/") 
    { 
     return false; 
    } 
    return true; 
} 

Intenta hacerlo en una sola condición.

+0

Esta comprobación fallará con rutas que contengan un signo menos "-" – Lemmy4555

1

que he encontrado aquí un ejemplo: http://regexlib.com/Search.aspx?k=file+name&AspxAutoDetectCookieSupport=1 y he modificado para que coincida con pathes comenzando con '\':

^((([a-zA-Z]:|\\)\\)|(\\))?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$ 

Esto está claro en expresiones regulares versión sin escapar con es más fácil de leer (¡de verdad!)

Coincide con pathes como:

  • c: \ temp
  • \ temp
  • .. \ mi carpeta de
  • UOA

etc.

Cuestiones relacionadas