2010-10-26 53 views
21

Ký tự . trong một regex php chấp nhận tất cả các ký tự, ngoại trừ một dòng mới. Tôi có thể sử dụng những gì để chấp nhận TẤT CẢ các ký tự, bao gồm cả dòng mới?PHP Regex Bất kỳ ký tự nào

Trả lời

38

này thường được sử dụng để nắm bắt tất cả các nhân vật:

[\s\S] 

Bạn có thể sử dụng bất kỳ sự kết hợp khác của "Type-X + Không phải loại-X "theo cùng một cách:

[\d\D] 
[\w\W] 

nhưng [\s\S] được công nhận là viết tắt của" thực sự bất kỳ điều gì ".

Bạn cũng có thể sử dụng . nếu bạn chuyển regex sang chế độ "dotall" (a.k.a. "single-line") qua công cụ sửa đổi "s". Đôi khi, đó không phải là giải pháp khả thi (regex động trong hộp đen chẳng hạn hoặc nếu bạn không muốn sửa đổi toàn bộ toàn bộ regex). Trong những trường hợp như vậy, các lựa chọn thay thế khác cũng giống nhau, bất kể cấu hình regex được định cấu hình như thế nào.

+0

Hoàn hảo! Cảm ơn! – Entity

+0

Có vẻ như đây là một ký tự đơn chứ không phải cho tất cả các ký tự ... –

+0

Và tại sao bạn lại nghĩ vậy? – Tomalak

8

Đó là ký tự . có nghĩa là "mọi ký tự" (chỉnh sửa: OP được chỉnh sửa). Và bạn cần phải thêm tùy chọn s để regexp của bạn, ví dụ:

preg_match("`(.+)`s", "\n"); 
+0

Không phải chuyển tiếp dấu gạch chéo ở đầu và cuối của regexp? – Entity

+5

Có thể, nhưng bất kỳ cặp dấu tách nào cũng sẽ làm. –

+0

Không có trong PHP. Nó phải bắt đầu và kết thúc bằng dấu phân tách (bạn có thể chọn nó), và mọi ký tự trong dấu phân cách cuối cùng là một tùy chọn (nghĩa là U cho không phù hợp, tôi không phân biệt dạng chữ, v.v.) –

1

sẽ

[.\n]+ 

không hoạt động?

Làm thế nào về (.|\n)+? Tôi đã thử nghiệm nó và nó có vẻ hoạt động.

Tôi khá chắc chắn đây là cách diễn đạt theo nghĩa đen chính xác những gì bạn đang yêu cầu.

+2

Không, nó sẽ không. – SLaks

+0

Chữ '.' trong một lớp ký tự không có nghĩa là" bất kỳ ký tự nào ". Nó có nghĩa là "một dấu chấm". Các lớp ký tự có cú pháp riêng của chúng. ;-) – Tomalak

+0

@Tomalak: Cảm ơn lời giải thích, tôi vừa mới nhận ra nó ngay bây giờ. Tôi đoán tôi nên kiểm tra câu trả lời của mình trước khi đăng. Tôi đã chỉnh sửa câu trả lời của tôi ngay bây giờ. – gnomed

0

Các PHP Manual page for Dot bang rằng:

Nếu tùy chọn PCRE_DOTALL được thiết lập, sau đó chấm phù hợp với dòng mới là tốt.

0

Điều quan trọng bị thiếu ở đây. [\s\S] khớp với một ký tự, trong khi dòng mới có thể là chuỗi ký tự. (Windows sử dụng hai ký tự: \r\n.) Không phải . (với DOT_ALL công cụ sửa đổi) cũng không phải [\s\S] sẽ khớp với trình tự dòng mới. Cách tốt nhất để khớp với bất kỳ ký tự hoặc dòng mới nào là (.|\R), "mọi thứ ngoại trừ một dòng mới hoặc một dòng mới". \R khớp với \n, \r\r\n.

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