2010-05-03 26 views
7

Ai đó có thể vui lòng giúp tôi với điều này preg_matchPHP biểu thức chính quy để phù hợp với một filepath

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

tôi cần phải phù hợp với một filepath càng tốt. Vì vậy, tôi cần phải kiểm tra xem có dấu gạch chéo kép vv Có giá trị chuỗi đường dẫn tập tin sẽ trông như thế chỉ này:

mydir/aFile.php 

hoặc

mydir/another_dir/anyfile.js 

Vì vậy, một dấu gạch chéo ở phần đầu của chuỗi này cần được kiểm tra cũng có. Hãy giúp tôi.

Cảm ơn :)

EDIT: Ngoài ra, chàng trai, con đường này đang được đọc từ bên trong một file văn bản. Nó không phải là một filepath trên hệ thống. Vì vậy, hy vọng nó sẽ có thể hỗ trợ tất cả các hệ thống trong trường hợp này.

RE-EDIT: Xin lỗi, nhưng chuỗi cũng có thể giống như thế này quá: myfile.php, hoặc myfile.js, hoặc myfile.anything

Làm thế nào để cho phép chuỗi như thế này cũng ?? Tôi xin lỗi vì không được quá cụ thể về vấn đề này trước khi ...

+0

Chỉ có hai đường dẫn mẫu được bạn hiển thị? – codaddict

+0

Bất kỳ phần mở rộng tệp nào phải được khớp. Không thể có bất kỳ dấu gạch chéo ở phía trước của chuỗi, và không thể có bất kỳ dấu gạch chéo ở cuối của chuỗi. Đó là giới hạn duy nhất đối với nó, và nó phải là các ký tự A-Z, a-z, 0-9, hoặc có và dấu gạch dưới hoặc một dấu chấm trong đó. Đó là tất cả. – SoLoGHoST

+0

Đường dẫn hệ thống tệp nào nên hợp lệ? – Gumbo

Trả lời

10

Bạn có thể làm:

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

Tôi có thể sử dụng tính năng này để chỉ kiểm tra đường dẫn không hợp lệ không? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ đường dẫn))' – SoLoGHoST

+0

Vâng, bạn có thể làm điều đó. – codaddict

+0

Xin lỗi, điều này không hoạt động, tôi đã thử nó, nhưng nó sẽ là một thông báo lỗi khi tôi có chuỗi này: 'myfile.php' – SoLoGHoST

12

Xin lưu ý rằng có rất nhiều loại đường dẫn tập tin càng tốt. Ví dụ:

  • "./"
  • "../"
  • "........" (có điều này có thể là tên của một tập tin)
  • "tập tin/file.txt "
  • "tập tin/file"
  • "file.txt"
  • "tập tin /../.// tập tin/file/file"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ asd/asd" (Windows, php chấp nhận điều này)
  • "tập tin /../.// tập tin/file/file ! @ # $"
  • "tập tin /../.// file/file/[email protected]#.php.php.php.pdf.php"

Tất cả các đường dẫn tập tin có giá trị. Tôi không thể nghĩ ra một regex đơn giản có thể làm cho nó hoàn hảo.

Giả sử nó chỉ là một con đường UNIX cho bây giờ, đây là những gì tôi nghĩ nên làm việc cho hầu hết các trường hợp:

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

Nó kiểm tra tất cả các chuỗi cho ^, *,", <,>, |? ,: (loại bỏ điều này cho các cửa sổ) Đây là tất cả các ký tự mà cửa sổ không cho phép cho tên tập tin, cùng với/và.

Nếu đó là cửa sổ, bạn nên thay thế đường dẫn \ bằng/và sau đó phát nổ và kiểm tra xem nó có tuyệt đối không. Đây là một ví dụ làm việc trong cả Unix và 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

tôi có thể concat tất cả các regex có thể có trong một regex – eronax59

Các vấn đề liên quan