2011-01-17 38 views
20

Tôi đang cố gắng liệt kê các tệp trong thư mục (đệ quy hoặc không) với PHP trong đó tên tệp khớp với mẫu nhất định. Tôi chưa bao giờ quá tuyệt vời với regex nên bất kỳ sự trợ giúp nào bạn có thể cung cấp sẽ là tuyệt vời. Tôi có thể tìm kiếm một tấm séc đen trên tên tập tin trở lại, nhưng tôi nghĩ đó không phải là một ý tưởng tuyệt vời như vậy :)Tìm tất cả các tệp trong thư mục có chuỗi hoặc mẫu trong tên tệp bằng PHP

Cập nhật + Giải pháp cuối cùng: 2011/01/18 @ 20:06

Tôi tìm thấy một cách khác để làm những gì tôi đang tìm kiếm một khi tôi hiểu regex nhiều hơn một chút. Tôi đã hoàn toàn thất vọng về việc tôi ở đâu với regex, bây giờ tôi nhận được một chút nhờ một người bạn kéo tôi sang một bên để giải thích một số điều này theo những thuật ngữ đơn giản hơn so với những gì tôi tìm thấy trong hướng dẫn trực tuyến.

Giải pháp này về cơ bản kiểm tra một (các) hình ảnh cụ thể có tiền tố hàng đầu là "tiền tố" hoặc "tiền tố", đồng thời xác minh rằng đó là hình ảnh của một loại nhất định (jpg, jpeg, png) và khớp với bất kỳ các định dạng sau.

Tùy thuộc vào slug bạn đã chuyển từ Wordpress (nơi tôi đang sử dụng), nó sẽ khớp với biểu thức chính quy đó. Dưới đây là một danh sách mẫu:

prefixone.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.002.jpeg 
prefixtwo.123-abc._tag2._tag1.003.jpg 
prefixone.123-abc._tag2.004.jpeg 
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg 
prefixtwo.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.001.png 
prefixtwo.456-rst._tag1.001.png 

Tất cả những tập tin này có thể đã có khả năng được trả lại trong file danh sách từ opendir của chúng tôi() chức năng, bất kỳ những có thể là một trận đấu nếu sên phù hợp. Bất kể thứ tự của thông tin gắn thẻ trong tên tệp.

Tôi hy vọng điều này sẽ giúp người dùng khác đấu tranh với regex. Đó là một nỗi đau để có được hang của nhưng một khi bạn hiểu một vài điều cơ bản, phần còn lại bắt đầu nhanh chóng rơi vào vị trí để bắt đầu xây dựng của riêng bạn.

Code:

<?php 
// create an array to hold directory list 
$results = array(); 

// create a handler for the directory 
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/'; 
$handler = opendir($directory); 

// open directory and walk through the filenames 
while ($file = readdir($handler)) { 

    // if file isn't this directory or its parent, add it to the results 
    if ($file != "." && $file != "..") { 

     // check with regex that the file format is what we're expecting and not something else 
     if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) { 

      // add to our file array for later use 
      $results[] = $file; 
     } 
    } 
} 
?> 

Tôi không thực sự cần đệ quy cho điều này, nhưng có thực sự rất nhiều ví dụ về đệ quy trực tuyến và đó là thực sự là ít trong số những lo lắng của tôi. Cách ly nội dung theo mẫu là cốt lõi của tác vụ này nên mã trên đã đủ.

Sidenote:

Để những người chỉ ra những "ý kiến ​​chấp nhận" ngày hôm qua, tôi không có ý tưởng tôi đã mất tích đó và tôi xin lỗi. Tôi đã có một ngày tồi tệ. Xin lỗi nếu tôi dường như chụp bất cứ ai về các bình luận. Đây là một cộng đồng tuyệt vời và tôi rất sẵn lòng trả lại nơi tôi có thể.

+0

Tôi đã trả lời một số, nhưng nó cũng cho biết 0 trong số 6 câu hỏi đủ điều kiện đã được trả lời. Tôi thậm chí không thấy nơi mà 6 khu vực mà nó mong đợi tôi để trả lời. –

+1

Khi tôi nhìn thấy một cái gì đó tôi nghĩ rằng tôi có thể đóng góp, tôi cố gắng trả lời hoặc nghiên cứu vấn đề cho người đó. –

+0

Vâng, tôi thấy điều đó ngay bây giờ. Xin lỗi fellas. –

Trả lời

15

Sử dụng glob to find pathnames matching a pattern hoặc GlobIterator.

Nếu bạn cần đó là đệ quy use a RegexIterator and a RecursiveDirectoryIterator.

Đánh dấu CW này vì câu hỏi là một cách chắc chắn trùng lặp và bạn có thể dễ dàng tìm thấy ví dụ cho tất cả những điều trên khi sử dụng chức năng tìm kiếm. Xin hãy làm như vậy.

+3

Tôi đã không tìm kiếm "RegexIterator" vì nó đã không vượt qua tâm trí của tôi. Không cần phải gọi cho tôi vì không tìm kiếm. Đó là điều đầu tiên tôi làm trước khi dành thời gian để viết điều gì đó. Tìm kiếm nhanh hơn. –

+2

Tôi đánh giá cao việc bạn chỉ ra điều đó. Trợ giúp lớn và cảm ơn :) –

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