2011-09-23 12 views
16

Tôi đang làm việc với cụm từ thông dụng trong PHP. Tôi có chuỗi sau:Làm cách nào để đối sánh khoảng trắng, tốc độ truyền tải dòng và nguồn cấp dữ liệu bằng cụm từ thông dụng trong PHP?

<img 
src="/files/admin/hotel_website.gif" alt="Go To The Hotel's Web 
Site" align="absmiddle" border="0" class="hotel_icon" /> 

Chuỗi này chứa ký tự trả về và dòng nguồn cấp dữ liệu.

Tôi muốn biểu thức chính quy của mình thay thế thẻ html img bằng IMG nhưng điều này không hoạt động với văn bản ở trên.

Tôi phát hiện ra nó chứa các ký tự này bằng cách lặp qua từng ký tự trong chuỗi và in ra biểu diễn thập lục phân có thể tìm thấy ở đây (http://pastebin.com/ViNdBsRV).

Đây là biểu hiện thường xuyên của tôi:

strip_tags(preg_replace('/^\s*<img\s*.*\/?>\s*$/i', '[IMG]', $test)); 

Đánh giá cao sự giúp đỡ.

+0

bạn có thể vui lòng cho tôi xem chuỗi nào bạn mong đợi từ các chuỗi bắt đầu? –

Trả lời

5

này:

preg_replace("#<img.+?/>#is", '[IMG]', $test) 

Cá nhân khi tôi đang thực hiện một biểu thức chính quy tôi luôn cố gắng để đi ngắn nhất/đơn giản nhất. Tại đây, bạn muốn thay thế toàn bộ thẻ, bắt đầu bằng '<img' và kết thúc bằng '/>', '.+?' là bắt không tham lam (lười). Và đối với các sửa đổi 'i' đối với trường hợp và 's' thành . khả năng là một dòng mới.

Thông tin thêm về greedyness vs lazyness: http://www.regular-expressions.info/repeat.html
Thông tin thêm về bổ: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Điều này hoạt động như mong đợi, nhờ lời giải thích toàn diện. Tôi tinh chỉnh nó một chút để phù hợp với các trường hợp khác:/ \ s * $/là – Sid

+0

@Sid Bạn không cần thêm '\ s $' giải pháp của tôi đã hoạt động để thay thế '' trên toàn bộ trang (đây là cách Tôi đã thử nghiệm regex). – 3on

+0

Tôi đã thêm $ vì tôi nhận được chuỗi html từ bảng cơ sở dữ liệu. – Sid

43

[\n\r]+ Sẽ khớp với các dòng mới. Đối với không gian trắng thêm [\n\r\s]+

+0

Tôi đã thêm điều này vào biểu thức chính quy nhưng nó không hoạt động; '/^\ s * \ s * $/i' – Sid

+6

không có vùng bao gồm \ r và \ n? –

+1

@ Col.Shrapnel: yes – salathe

2

này đã làm việc đối với tôi nó phù hợp với nhiều không gian và multilines, cũng bất kỳ ký tự hoặc biểu tượng khác.

[\S+\n\r\s]+ 

Hy vọng điều này sẽ giúp mọi người.

Nó phù hợp với ví dụ:

stpd : asdfasdf 
this is also matching *** 
+4

Đặt một' + 'bên trong' [] 'làm cho nó khớp với dấu cộng.' \ S' đối diện với '\ s', vì vậy bạn về cơ bản khớp với bất kỳ ký tự nào. '[\ s \ S] +' là giải pháp là '.' không * bình thường * khớp với các ký tự dòng mới. Không có nhiều sử dụng cho chính kết hợp này. – bradlis7