2009-04-08 39 views
5

Tôi đang tìm kiếm thứ gì đó như trim() nhưng trong giới hạn của một chuỗi. Người dùng đôi khi đặt 2, 3, 4 hoặc nhiều dòng trở lại sau khi họ nhập, tôi cần phải khử trùng đầu vào này.Xóa các dòng trả về quá mức

mẫu đầu vào

i like cats 


my cat is happy 
i love my cat 



hope you have a nice day 

đầu ra mong muốn

i like cats 

my cat is happy 
i love my cat 

hope you have a nice day 

Tôi không nhìn thấy bất cứ điều gì được xây dựng trong, và một chuỗi thay thế sẽ mất nhiều lần lặp của nó để làm việc. Trước khi tôi whip lên một chuỗi đệ quy nhỏ thay thế, tôi muốn xem những gì khác đề nghị tất cả các bạn có.

Tôi có một cảm giác kỳ lạ cũng có một regex cho điều này.

Trả lời

3

Cuối cùng quản lý để có được nó, cần preg nên bạn đang sử dụng phiên bản PCRE trong php, và cũng cần một chuỗi \ n thay thế \ n, để không lau tất cả kết thúc dòng nhưng một:.

$body = preg_replace("/\n\n+/", "\n\n", $body); 

Cám ơn nhận cho tôi đi đúng hướng

+0

Có lẽ bạn nên chọn câu trả lời được chấp nhận (tharkun's) để câu hỏi này được đánh dấu là đã trả lời (và được lấy ra khỏi hàng đợi chưa trả lời). – Calvin

3

Bạn cần bao nhiêu văn bản để thực hiện việc này? Nếu nó nhỏ hơn khoảng 100k thì bạn có thể chỉ cần sử dụng tìm kiếm đơn giản và thay thế regex (tìm kiếm một số thứ như /\n+/ và thay thế bằng \n)

Mặt khác nếu bạn cần trải qua megabyte dữ liệu thì bạn có thể phân tích cú pháp ký tự văn bản theo ký tự, sao chép đầu vào vào đầu ra, ngoại trừ khi các dòng mới mulitple gặp phải, trong trường hợp đó bạn sẽ chỉ sao chép một dòng mới và bỏ qua phần còn lại.

Tôi không khuyên bạn nên thay thế chuỗi đệ quy, âm thanh như vậy sẽ rất chậm.

+0

Không nhiều, một email đáng giá cho người dùng gửi email, nó là một phần của hệ thống web. –

10
function str_squeeze($body) { 
    return preg_replace("/\n\n+/", "\n\n", $body); 
} 
+0

Điều này trả về tất cả các dòng được phân cách bằng một \ n, sau khi tôi thay đổi 'thành' trong số. –

+0

Một regex được sắp xếp hợp lý hơn sẽ giống như sau: preg_replace ("/ \ n {2,} /", "\ n \ n ", $ body); – KOGI

+0

cảm ơn KOGI. Sắp xếp hợp lý, tốt hơn, nó có nhiều mã hơn. Nhanh hơn? – markus

2

Các biểu hiện thường xuyên sau nên loại bỏ nhiều linebreaks trong khi bỏ qua các dấu ngắt dòng duy nhất, đó là okay theo định nghĩa của bạn:

ereg_replace("\n\n+", "\n\n", $string); 

Bạn có thể thử nghiệm nó với PHP Regular Expression test tool này, đó là rất tiện dụng (nhưng như có vẻ như không hoàn toàn tương đương với PHP).

[EDIT] Cố định 'to", vì chúng không có vẻ để làm việc Phải thừa nhận tôi chỉ thử nghiệm regex trong công cụ web;..)

+0

Tôi không nhận được kết quả cho đến khi tôi thay đổi 'thành a' trong biểu thức và thay thế. Sau đó, nó hoạt động, nhưng giết chết \ n \ n –

+0

Regex đó không hoàn toàn chẵn lẻ với php. Tôi sẽ tiếp tục tìm kiếm giải pháp. –

3

Để xem xét tất cả ba chuỗi ngắt dòng:

preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $str) 
+0

Cảm ơn, tôi chạy một dòng kết thúc unifier trước khi chạy preg_replace ("/ \ n \ n + /", "\ n \ n", $ body); –

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