2010-05-03 25 views
7

por favor alguien puede ayudar con esto preg_matchPHP expresión regular para que coincida con una ruta de archivo

if (preg_match('~[^A-Za-z0-9_\./\]~', $filepath)) 
    // Show Error message. 

que necesito para que coincida con una posible ruta de archivo. Así que necesito para comprobar si hay dos barras, etc. cadenas de ruta de archivo válidos deben tener este aspecto solamente:

mydir/aFile.php 

o

mydir/another_dir/anyfile.js 

así que una barra al comienzo de esta cadena debe comprobarse también. Por favor ayuda.

Gracias :)

EDIT: Además, chicos, este camino se está leyendo desde un archivo de texto. No es un archivo en el sistema. Entonces, con suerte, debería ser capaz de soportar todos los sistemas en este caso.

volver a editar: Lo sentimos, pero la cadena también pueden parecerse a esto también: myfile.php, o myfile.js, o myfile.anything

¿Cómo permito cadenas de este tipo, así ?? Me disculpo por no ser demasiado específico sobre esto antes ...

+0

Solo las dos rutas de muestra que usted muestra deben coincidir? – codaddict

+0

Cualquier extensión de archivo debe coincidir. No puede haber barras delante de la cuerda, y no puede tener ninguna barra al final de la cuerda. Ese es el único límite, y debe ser caracteres A-Z, a-z, 0-9, o tener y guión bajo o un punto en él. Eso es todo. – SoLoGHoST

+0

¿Para qué sistemas de archivos debe ser válida la ruta? – Gumbo

Respuesta

10

que puede hacer:

if(preg_match('#^(\w+/){1,2}\w+\.\w+$#',$path)) { 
     // valid path. 
}else{ 
     // invalid path 
} 
+0

¿Puedo usar esto para que solo compruebe si hay rutas no válidas? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ path))' – SoLoGHoST

+0

Sí, puedes hacer eso. – codaddict

+0

Lo siento, esto no funciona, lo intenté, pero aparece un mensaje de error cuando tengo esta cadena: 'myfile.php' – SoLoGHoST

12

Tenga en cuenta que hay muchos tipos de posibles rutas de archivos. Por ejemplo:

  • "./"
  • "../"
  • "........" (sí, esto puede ser el nombre de un archivo) archivo
  • "/ archivo.txt "
  • "archivo/archivo"
  • "archivo.txt"
  • "archivo /.././//archivo/archivo"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ asd/asd" (Windows, php acepta esto)
  • "archivo /.././//archivo/archivo ! @ # $"
  • "archivo /../.// file/file/[email protected]#.php.php.php.pdf.php"

Todas estas rutas de archivos son válidos. No puedo pensar en una expresión regular simple que pueda hacerlo perfecto.

Vamos a suponer que es sólo un camino UNIX, por ahora, esto es lo que creo que debería funcionar para la mayoría de los casos:

preg_match('/^[^*?"<>|:]*$/',$path) 

Se comprueba toda la cadena para ^, *,", <,>, |? ,: (eliminar esto para Windows). Estos son todos los caracteres que Windows no permite para el nombre del archivo, junto con/y.

Si se trata de ventanas, debe reemplazar la ruta \ con/y luego explotar y comprobar si es absoluta. Aquí hay un ejemplo que funciona tanto en Unix como en Windows.

function is_filepath($path) 
{ 
    $path = trim($path); 
    if(preg_match('/^[^*?"<>|:]*$/',$path)) return true; // good to go 

    if(!defined('WINDOWS_SERVER')) 
    { 
     $tmp = dirname(__FILE__); 
     if (strpos($tmp, '/', 0)!==false) define('WINDOWS_SERVER', false); 
     else define('WINDOWS_SERVER', true); 
    } 
    /*first, we need to check if the system is windows*/ 
    if(WINDOWS_SERVER) 
    { 
     if(strpos($path, ":") == 1 && preg_match('/[a-zA-Z]/', $path[0])) // check if it's something like C:\ 
     { 
      $tmp = substr($path,2); 
      $bool = preg_match('/^[^*?"<>|:]*$/',$tmp); 
      return ($bool == 1); // so that it will return only true and false 
     } 
     return false; 
    } 
    //else // else is not needed 
     return false; // that t 
} 
+0

puedo concat todas las expresiones regulares posibles en una expresión regular – eronax59

Cuestiones relacionadas