2014-05-09 14 views
5

Tôi lấy lại tên tệp trong một hàm. Tôi muốn trả về tất cả các tệp tương tự với tệp này (theo tên tệp) từ thư mục khác. Tôi đã viết điều này:Mẫu RegEx trong hàm glob

$thumbDir = $this->files_path.'thumbs/'; 
    $toglob = $thumbDir.pathinfo($name, PATHINFO_FILENAME).'_[0-9]+\x[0-9]+_thb.'.pathinfo($name, PATHINFO_EXTENSION); 
    foreach (glob($toglob) as $key => $value) { 
     echo $value; 
    } 

Nhưng nó không hoạt động. Tôi tìm kiếm các tập tin mà tên tập tin của họ là:

oldFileName_[one or more digits]x[one or more digits]_thb.oldFileNameExtension 

Tôi sẽ rất biết ơn nếu ai đó giúp tôi với điều này :)

Trả lời

11

glob() thực sự là một công cụ bán regex. Từ một bình luận trên các tài liệu, nó cho phép một ?*:

glob sử dụng hai biểu tượng đặc biệt mà hành động như sắp xếp của một sự pha trộn giữa một meta-nhân vật và một lượng hóa. Hai ký tự này là * và?

? phù hợp 1 của bất kỳ nhân vật, ngoại trừ một/

Các * phù hợp với 0 hoặc nhiều hơn của bất kỳ nhân vật, ngoại trừ một/

Nếu nó giúp, suy nghĩ của * như tương đương với PCRE của. * và? tương đương với pcre của dấu chấm (.)

Điều này có nghĩa là bạn không thể sử dụng cụm từ của mình _[0-9]+\x[0-9]+_thb. trong glob(). Thay vào đó, bạn có thể nhìn vào toàn bộ thư mục và xem nếu nó phù hợp với preg_match():

$glob = glob('/path/to/dir/*'); 
foreach($glob as $file) { 
    if(preg_match('/_\d+x\d+_thb\./', $file)) { 
     // Valid match 
     echo $file; 
    } 
} 

Nhận ra rằng trong glob(/path/to/dir/*);, các * không phù hợp với một / vì vậy đây sẽ không nhận được bất kỳ tập tin trong thư mục con. Nó sẽ chỉ lặp qua mọi tập tin và thư mục trong đường dẫn đó; nếu bạn muốn đi sâu hơn, bạn sẽ phải thực hiện một hàm đệ quy.

Lưu ý tôi làm sạch của bạn expression:

_\d+x\d+_thb\. 

\d khoảng bằng [0-9] (nó cũng bao gồm ký tự chữ số Ả Rập, vv), bạn không cần phải thoát khỏi x (vì vậy không \x), và bạn muốn thoát khỏi khoảng thời gian (\.).

+2

đây là nhận xét toàn cục của tôi mà bạn trích dẫn từ, ngày của tôi được tạo, hoozah! :) –

+1

@CrayonViolent haha ​​awesome, nó là một trong những nhận xét tốt hơn về tài liệu PHP mà tôi đã thấy - cũng có một số lượng upvotes tốt. Bạn phải là người 'glob()' nếu bạn vấp phải câu hỏi này;) – Sam

+0

Cảm ơn bạn đã trả lời :) – user3025978

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