2009-07-25 18 views
13

$data chứa các tab, không gian hàng đầu và nhiều không gian. Tôi muốn thay thế tất cả các tab bằng dấu cách. Nhiều không gian với một không gian duy nhất và loại bỏ không gian hàng đầu.Làm cách nào để thay thế các tab bằng dấu cách trong các biến trong PHP?

Trong thực tế somthing rằng sẽ chuyển dữ liệu đầu vào này:

[ asdf asdf  asdf   asdf ] 

Into dữ liệu đầu ra:

[asdf asdf asdf asdf] 

Làm thế nào để làm điều này?

+0

Bạn đang cố gắng loại bỏ tất cả * tab bất kể hoặc bạn có mong muốn duy trì định dạng cột không? – Synetech

+0

Tôi nghĩ bạn nên đánh giá lại câu trả lời và chấp nhận câu trả lời khác. – Jeff

Trả lời

14
$data = trim(preg_replace('/\s+/g', '', $data)); 
+0

Bạn cũng quên đề cập đến cắt để loại bỏ các không gian hàng đầu. Có lẽ muốn đề cập đến ltrim quá, kể từ khi ông yêu cầu không gian hàng đầu sau đó minh họa cả hai đầu. –

+0

Vâng, cảm ơn vì đã chỉ ra điều đó. Trong ví dụ, nó cho thấy rằng cả hai không gian hàng đầu và cuối phải được loại bỏ vì vậy tôi đã cập nhật mã của mình. – RaYell

+0

hữu ích. [preg_replace] (http://php.net/manual/en/function.preg-replace.php) mặc định để thay thế tất cả các lần xuất hiện của mẫu, trừ khi bạn chỉ định tham số giới hạn. – JustinP

1
$data = trim($data); 

Đó giúp loại bỏ các hàng đầu (và trailing) không gian của bạn.

$pattern = '/\s+/'; 
$data = preg_replace($pattern, ' ', $data); 

Điều này biến bất kỳ bộ sưu tập nào của một hoặc nhiều không gian thành chỉ một không gian.

$data = str_replace("\t", " ", $data); 

Điều đó sẽ loại bỏ các tab của bạn.

+0

Nếu bạn đang sử dụng '\ s' bạn không cần' \ t' – Jeff

3

Giả sử các dấu ngoặc vuông không phải là một phần của chuỗi và bạn chỉ cần sử dụng chúng cho mục đích minh họa, sau đó:

$new_string = trim(preg_replace('!\s+!', ' ', $old_string)); 

Bạn có thể có thể làm điều đó với một regex duy nhất nhưng nó sẽ là một regex khá phức tạp. Ở trên là đơn giản hơn nhiều.

Lưu ý: Tôi cũng giả sử bạn không muốn thay thế "AB \ t \ tCD" (\ t là tab) bằng "AB CD".

+0

Điều này phải được chấp nhận câu trả lời. Tôi đăng câu trả lời của tôi chỉ để bác bỏ yêu cầu của bạn mà cắt tỉa với 'preg_replace' là" phức tạp ". – Jeff

+0

Câu trả lời hay. Cảm ơn bạn. – mghhgm

2
$new_data = preg_replace("/[\t\s]+/", " ", trim($data)); 
+0

nếu bạn đang sử dụng '\ s' bạn không cần' \ t' – Jeff

16

Trim, thay thế các tab và không gian thêm với không gian duy nhất:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data)); 
+1

điều này đã giúp tôi rất nhiều, cảm ơn bạn –

+0

Đầu tiên, đây là một mô hình khó khăn. Thứ hai, như bạn đã viết nó, nó không rescan, và do đó nó sẽ tạo ra nhiều không gian cho một 'tab'' không gian '' tab' 'không gian' 'tab'' không gian'. Bạn đã thử nghiệm này? – Jeff

-1

Chỉ cần sử dụng regex này

$str = trim(preg_replace('/\s\s+/', ' ', $str)); 

nó sẽ thay thế tất cả các tab và không gian bởi một không gian,

tại đây ký + trong regex có nghĩa là một hoặc nhiều lần, patte rn có nghĩa là, bất cứ nơi nào có hai hoặc nhiều khoảng trống, hãy thay thế nó bằng một khoảng trống

+0

trừ một đối với mẫu không khớp với tab đơn độc (và không kiểm tra giải pháp của bạn trước khi đăng). – Jeff

0

Câu trả lời này có nghĩa hoàn toàn là: chỉ liên quan đến không gian và tab. Được cấp, OP có lẽ cũng muốn bao gồm các loại khoảng trắng khác trong những gì được cắt/nén, nhưng giả sử anh ta muốn giữ lại được nhúng CR và/hoặc LF.

Trước tiên, hãy thiết lập một số hằng số. Điều này sẽ cho phép cả hai dễ hiểu và dễ bảo trì, nên các sửa đổi trở nên cần thiết. Tôi đưa vào một số không gian phụ để bạn có thể so sánh các điểm tương đồng và khác biệt dễ dàng hơn.

define('S', '[ \t]+'  ); # Stuff you want to compress; in this case ONLY spaces/tabs 
define('L', '/\A'.S.'/' ); # stuff on the Left edge will be trimmed 
define('M', '/'.S.'/' ); # stuff in the Middle will be compressed 
define('R', '/'.S.'\Z/'); # stuff on the Right edge will be trimmed 
define('T', ' '   ); # what we want the stuff compressed To 

Chúng tôi đang sử dụng \A\Zescape characters để xác định đầu và cuối của đối tượng, thay vì tiêu biểu ^$ đó là dòng hướng meta-characters. Điều này không quá nhiều vì chúng cần thiết trong trường hợp này nhiều như lập trình "phòng thủ", nên giá trị của S thay đổi để làm cho chúng cần thiết trong tương lai.

Bây giờ cho các nước sốt bí mật: chúng ta sẽ tận dụng lợi thế của một số ngữ nghĩa đặc biệt của preg_replace, cụ thể là (nhấn mạnh thêm)

Nếu có ít yếu tố trong việc thay thế mảng hơn trong mảng mẫu, mọi mẫu phụ sẽ được thay thế bằng một chuỗi rỗng.

function trim_press($data){ 
    return preg_replace([ M, L, R ], [ T ], $data); 
} 

Vì vậy, thay vì một mô hình chuỗi và chuỗi thay thế, chúng tôi đang sử dụng một mảng hoa văn và thay thế mảng, mà kết quả trong các mô hình phụ LR được tỉa.

0

Trong trường hợp bạn cần xóa   quá.

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));