2012-02-09 26 views
8

Hãy xem xét các chuỗi sau:Làm sao để regex bỏ qua mọi thứ giữa các dấu ngoặc?

I have been driving to {Palm.!.Beach:100} and it . was . great!! 

tôi sử dụng regex sau để xóa tất cả các dấu chấm câu:

$string preg_replace('/[^a-zA-Z ]+/', '', $string); 

này kết quả đầu ra:

I have been driving to PalmBeach and it was great!! 

Nhưng tôi cần regex để luôn luôn bỏ qua bất cứ điều gì nằm trong khoảng từ {đến}. Vì vậy, kết quả mong muốn sẽ là:

I have been driving to {Palm.!.Beach:100} and it was great 

Làm cách nào để cho phép regex bỏ qua những gì nằm giữa {và}?

+0

trùng lặp có thể xảy ra của [tất cả mọi thứ Chữ thường trừ khi giữa dấu ngoặc] (http://stackoverflow.com/questions/9229030/lowercase-everything-except-when-between-brackets) – hakre

Trả lời

11

Hãy thử điều này

[^a-zA-Z {}]+(?![^{]*}) 

Xem nó here on Regexr

phương tiện phù hợp với bất cứ điều gì mà không được bao gồm trong các lớp nhân vật phủ nhận, nhưng chỉ nếu không có khung đóng cửa trước mà không có một mở đầu trước, điều này được thực hiện bởi lookahead tiêu cực (?![^{]*}).

$string preg_replace('/[^a-zA-Z {}]+(?![^{]*})/', '', $string); 
+0

Lỗi của tôi - Tôi đã quên yêu cầu rằng mọi thứ không nằm trong ngoặc đơn phải được trả về chữ thường. Vì vậy, một lần nữa, những gì là giữa các dấu ngoặc đơn còn lại một mình. Có thể với regex này để trả lại phần còn lại trong chữ thường? – Pr0no

+0

Tôi sẽ nói, không phải trong cùng một preg_replace. Nhưng trong một bước thứ hai không có vấn đề gì. Kiểm tra [link] này (http://de2.php.net/manual/en/functions.anonymous.php) nó sẽ giúp bạn bắt đầu. Nếu bạn có vấn đề, hãy hỏi một câu hỏi mới sau đó. – stema

4
$str = preg_replace('(\{[^}]+\}(*SKIP)(*FAIL)|[^a-zA-Z ]+)', '', $str); 

Xem thêm Split string by delimiter, but not if it is escaped.

+0

tôi đến một phần nào [tương tự kết luận] (http://stackoverflow.com/a/9260679/367456) (dựa trên câu trả lời được liên kết của bạn;)) trong câu hỏi trùng lặp (như tôi đã thấy). – hakre

+0

Yay, +100 cho '(* SKIP) (* F)'! ... @ Pr0no đây là một kỹ thuật thực sự hữu ích và thú vị, [this] (http://stackoverflow.com/q/23589174/) giải thích nó chi tiết. :) – zx81

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