2009-12-14 34 views
6

Tôi đã sử dụng các trang web sau để kiểm tra một regex PHP vì vậy tôi không phải liên tục tải lên: http://www.spaweditor.com/scripts/regex/index.phpPHP preg_replace rắc rối không tham lam

Tôi đang sử dụng regex sau:

/(.*?)\.{3}/ 

trên chuỗi sau (thay thế mà không có gì):

Non-important data...important data...more important data 

và preg_replace đang trở lại:

more important data 

nhưng tôi hy vọng nó sẽ trở lại:

important data...more important data 

tôi nghĩ? là công cụ sửa đổi không tham lam. Những gì đang xảy ra ở đây?

+0

Bạn đang sử dụng cài đặt nào trên trang web bạn đã liên kết? Tôi vừa thử nó và lấy lại "dữ liệu không quan trọng" như tôi mong đợi. Cụm từ thông dụng của bạn đang tìm kết quả đầu tiên, và nắm lấy ít nhất có thể trước khi nó có thể tìm thấy '...'. –

+0

@Doug Neiner: Trên liên kết trang web của mình, hãy đảm bảo bạn chọn 'preg_replace' trong phần cuối cùng. Tôi đã có thể tái tạo kết quả của OP theo cách này. – Asaph

+1

Ah, rất đúng. Chọn sai. –

Trả lời

8

Công cụ sửa đổi không tham lam của bạn hoạt động như mong đợi. Nhưng preg_match thay thế tất cả lần xuất hiện của kết quả (không tham lam) bằng văn bản thay thế ("" trong trường hợp của bạn). Nếu bạn chỉ muốn thay thế đầu tiên, bạn có thể vượt qua 1 làm đối số thứ 4 tùy chọn (giới hạn) thành hàm preg_replace (PHP docs for preg_replace). Trên trang web bạn đã liên kết, điều này có thể được thực hiện bằng cách nhập 1 vào nhập văn bản giữa từ "Cờ" và từ "giới hạn".

+1

+1 @Asaph, câu trả lời tuyệt vời. Tôi đã chọn 'preg_match' thay vì' preg_replace' khi tôi thử liên kết, vì vậy nó thông qua tôi về mùi hương. Bạn tất nhiên là hoàn toàn chính xác trong câu trả lời của bạn! –

0

chỉ là ví dụ thực tế về giải pháp @Asaph. Trong ví dụ này, bạn không cần sự tham lam vì bạn có thể chỉ định một số đếm. chỉ thay thế lần xuất hiện đầu tiên của @ theo dòng có điểm đánh dấu

$line=preg_replace('/@/','zzzzxxxzzz',$line,1);