Làm thế nào tôi có thể nổ tung và cắt khoảng trắng?


167

Ví dụ, tôi muốn tạo một mảng từ các thành phần trong chuỗi này:

$str = 'red,     green,     blue ,orange';

Tôi biết bạn có thể phát nổ và lặp qua chúng và cắt:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}

Nhưng tôi cảm thấy như có một cách tiếp cận một dòng có thể xử lý việc này. Có ý kiến ​​gì không?

Câu trả lời:


449

Bạn có thể thực hiện các thao tác sau bằng mảng_map :

$new_arr = array_map('trim', explode(',', $str));

10
Đây cũng là vòng lặp (nội bộ) bởi PHP
Jason OOO

2
này .... đã lưu .... cuộc sống ... của tôi .... Tôi đã cố gắng thao tác một tập tin thông qua fseek để nối vào cuối tập tin ... một khi tôi quyết định chia nó thành một mảng và viết lại các tập tin, tôi thấy rằng có thêm khoảng trắng được thêm vào toàn bộ thời gian ... điều này + đã cứu cuộc sống kỳ dị của tôi..tôi có thể đi ăn thức ăn ngay bây giờ.
jenki221

4
@JasonOOO Tôi nghĩ theo quan điểm của hầu hết mọi người, một vài phần nghìn giây (nếu thậm chí đó) là một sự đánh đổi công bằng để có một dòng mã ngắn, đơn giản và dễ đọc.
Gavin

Đơn giản và dễ hiểu. Tuy nhiên, nếu xử lý các tập dữ liệu lớn, câu trả lời hiệu quả hơn được cung cấp bởi @ amr-eladwy là giải pháp tốt hơn.
Yaron

Tôi thích đoạn mã này và quay lại trang web này ngay bây giờ và sau đó!
patrickzzz

51

Một câu trả lời được cải thiện

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');

Kết quả:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)

Điều này

  • Chỉ tách trên dấu phẩy
  • Trims khoảng trắng từ mỗi mục.
  • Bỏ qua các mục trống
  • Không phân chia một mục với không gian bên trong như "điều xanh"

7
Bất cứ ai có thể giải thích cho tôi tại sao câu trả lời này không có 100 upvote? Rất khó hiểu, nhưng nó đã phân tích tệp 100Mb của tôi nhanh hơn các giải pháp khác
Dan

2
Tôi vui vì bạn thấy nó hữu ích. Tôi đọc tất cả các câu trả lời và đi kèm với một kết hợp tốt hơn. Regex có thể được giải thích chi tiết.
Amr ElAdawy

2
Xin lỗi nhưng regex này là sai - hãy thử thay thế redbằng *red*. Một cái tốt hơn có thể là / (\ s *, \ s *) + /
Greg

@AmrElAdawy FYI này không còn hoạt động sau bản cập nhật 8-28. Với biểu thức chính trong câu trả lời, không gian trắng không bị cắt bớt khỏi một số yếu tố. Vd: 'điều xanh`.
Samsquanch

1
@Samsquanch cập nhật. Xin vui lòng cho tôi biết nếu bạn thấy bất kỳ vấn đề.
Amr ElAdawy

25

Sau đây cũng quan tâm đến khoảng trắng ở đầu / cuối chuỗi đầu vào:

$new_arr = preg_split('/\s*,\s*/', trim($str));

và đây là một thử nghiệm tối thiểu với khoảng trắng ở mọi vị trí hợp lý:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);

array_mapvà các giải pháp regrec tạo ra kết quả giống hệt nhau, bất cứ ai cũng có thể so sánh hiệu suất của họ?
Dan

@Dan Đối với những trường hợp như thế này, nó sẽ không có gì khác biệt.
Aris

4

đây là cách bạn thay thế và phát nổ trong một dòng mã

$str = 'red,     green,     blue ,orange';

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

sẽ đưa ra kết quả như

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)

3

Bằng cách kết hợp một số hiệu trưởng trong các câu trả lời hiện có, tôi đã đưa ra

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);

Lý do đằng sau nó là tôi đã tìm thấy một lỗi trong câu trả lời này , trong đó nếu có dấu phẩy ở cuối chuỗi thì nó sẽ trả về một phần tử trống trong mảng. I E

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');

Kết quả trong

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)

Bạn có thể khắc phục điều này bằng cách sử dụng PREGinksLIT_NO_EMPTY như được đề cập trong câu trả lời này để xóa nó, nhưng một khi bạn đang làm điều đó về mặt kỹ thuật thì không cần phải xóa dấu phẩy liên tiếp qua biểu thức chính quy, do đó biểu thức rút ngắn


2

Bạn cũng có thể làm điều này với regex một dòng

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);

1

thử cái này:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');

OP muốn một mảng. preg_replace()không tạo ra một mảng từ một chuỗi. Đây là câu trả lời đúng cho câu hỏi sai. Bị hạ bệ.
mickmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');sửa đổi nhỏ phục hồi câu trả lời
dreftymac

1

ĐẶC BIỆT cho chuỗi mẫu của OP, vì mỗi chuỗi con được khớp là một từ duy nhất, bạn có thể sử dụng str_word_count () .

Mã: ( Bản trình diễn )

$str = ' red,     green,     blue ,orange ';
var_export(str_word_count($str,1));  // 1 means return all words in an indexed array

Đầu ra:

array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
  3 => 'orange',
)

Điều này cũng có thể được điều chỉnh cho các chuỗi con ngoài các chữ cái (và một số dấu gạch ngang và dấu nháy đơn - nếu bạn đọc bản in đẹp) bằng cách thêm các ký tự cần thiết vào mặt nạ ký tự / tham số thứ 3.

Mã: ( Bản trình diễn )

$str = " , Number1 ,     234,     0 ,4heaven's-sake  ,  ";
var_export(str_word_count($str,1,'0..9'));

Đầu ra:

array (
  0 => 'Number1',
  1 => '234',
  2 => '0',
  3 => '4heaven\'s-sake',
)

Một lần nữa, tôi đang xử lý câu hỏi này rất hẹp vì chuỗi mẫu, nhưng điều này sẽ cung cấp cùng một đầu ra mong muốn:

Mã: ( Bản trình diễn )

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');

0

Bạn có thể sử dụng preg_split () cho điều đó.

$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */

Điều đó sẽ phân chia trên các không gian trong các yếu tố của bạn
Chris KL

Di chuyển dấu phẩy sang trái của dấu ngoặc vuông để tạo dấu phẩy cần thiết.
Eric Leschinski

Di chuyển dấu phẩy sang trái sẽ không giải quyết được điều đó. Vui lòng kiểm tra câu trả lời của tôi bên dưới stackoverflow.com/a/38300330/5079380
Amr ElAdawy 11/07/2016

-4
$str = str_replace(" ","", $str);

4
Trim còn làm được nhiều hơn thế ... Nó \t\n\r\0\x0Bcũng cắt
Arian Faurtosh

3
Không chỉ vậy, nhưng điều này sẽ làm hỏng các yếu tố với không gian.
Adam Kiss

-11

cắt và nổ

$ str = 'đỏ, xanh lá cây, xanh dương, cam';

$ str = trim ($ str);

$ strArray = explode (',', $ str);

print_r ($ strArray);


5
Điều này chỉ dải khoảng trắng từ đầu và cuối của một chuỗi, không phải giữa mỗi màu.
SeanWM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.