2012-01-19 35 views

Trả lời

14

Bạn cần DOTALL modifer /s, bởi vì số . mỗi mặc định không bao gồm dấu ngắt dòng. Bộ sửa đổi /g OTOH không hợp pháp trong PHP và PCRE.

Bạn cũng nên sử dụng .*? để không khớp quá rộng.

3

. khớp với mỗi ký tự ngoại trừ dòng mới theo mặc định, trừ khi bạn nạp nguồn vào khóa s.

Xem giải thích về công tắc regex here.

Đặc biệt

s (PCRE_DOTALL) Nếu sửa đổi lần này được thiết lập, một dấu chấm metacharater trong mẫu phù hợp với tất cả các nhân vật, bao gồm cả dòng mới. Không có nó, dòng mới sẽ bị loại trừ.

Vì vậy, /(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/is.

(Không g, sử dụng preg_match_all).

6

Trong PCRE, "." không khớp với mọi ký tự, nó khớp với mọi thứ không phải là dòng mới:

Bên ngoài một lớp ký tự, một dấu chấm trong mẫu khớp với bất kỳ một ký tự nào trong chủ thể, bao gồm ký tự không in, nhưng không (theo mặc định) newline.

(http://www.php.net/manual/en/regexp.reference.dot.php)

Hãy thử một cái gì đó như [\ s \ S] để thay thế.

+3

Hoặc, bạn biết đấy, bạn có thể nghe bất kỳ câu nào trong số ba câu trả lời hợp lệ khác xuất hiện trong khi tôi đang viết bài của tôi. –

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