공백을 어떻게 분해하고 다듬을 수 있습니까?


167

예를 들어이 문자열의 요소에서 배열을 만들고 싶습니다.

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

나는 당신이 그들을 폭발하고 반복하고 다룰 수 있다는 것을 알고 있습니다.

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

그러나 이것을 처리 할 수있는 한 줄 접근법이 있다고 생각합니다. 어떤 아이디어?

답변:


449

array_map을 사용하여 다음을 수행 할 수 있습니다 .

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

10
이것은 또한 PHP에 의해 (내부적으로) 반복됩니다
Jason OOO

2
this .... saved .... my ... life .... fseek를 통해 파일을 조작하여 파일 끝에 추가하려고했습니다 ... 한 번 배열로 나누고 다시 쓰기로 결정했습니다. 파일, 나는 여분의 공백이 항상 추가되는 것을 보았습니다 ...이 + implode는 내 인생을 살 렸습니다. 나는 지금 음식을 먹을 수 있습니다.
jenki221

4
@JasonOOO 나는 대부분의 사람들의 의견에 따르면, 몇 밀리 초 (그렇더라도 그조차도)는 짧고 간단하며 쉽게 읽을 수있는 코드 줄을 갖는 공정한 상충 관계라고 생각합니다.
Gavin

간단하고 이해하기 쉽습니다. 그러나 대용량 데이터 세트를 처리하는 경우 @ amr-eladwy가 제공하는 성능이 좋은 답변이 더 나은 솔루션입니다.
Yaron

나는이 코드를 좋아 하고이 사이트로 돌아왔다!
patrickzzz

52

개선 된 답변

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

결과:

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

  • 쉼표로만 분할
  • 각 항목에서 공백을 제거합니다.
  • 빈 항목을 무시합니다
  • "녹색 물건"과 같은 내부 공간으로 항목을 분할하지 않습니다

7
왜이 답변에 100 개의 공감대가 없는지 설명 할 수 있습니까? 정규식은 이해하기 어렵지만 다른 솔루션보다 100Mb 파일을 더 빨리 구문 분석했습니다.
Dan

2
도움이 되셨 다니 다행입니다. 나는 모든 대답을 읽고 더 나은 혼합을 제공했습니다. 정규식에 대해 자세히 설명 할 수 있습니다.
Amr ElAdawy

2
죄송하지만이 정규식이 잘못 red되었습니다 *red*.로 바꾸십시오 . 더 좋은 방법은 / (\ s *, \ s *) + /
Greg Greg

@AmrElAdawy 참고로 8/28 업데이트 후에는 더 이상 작동하지 않습니다. 정답을 그대로 사용하면 일부 요소에서 공백이 잘리지 않습니다. 예 :`녹색 것`.
Samsquanch

1
@Samsquanch가 업데이트되었습니다. 문제가 있으면 알려주세요.
Amr ElAdawy 2016 년

25

다음은 또한 입력 문자열의 시작 / 끝에서 공백을 처리합니다.

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

그리고 이것은 모든 합리적인 위치에 공백이있는 최소 테스트입니다.

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

이후 array_map정규 표현식 솔루션은 동일한 결과를 생성하고, 사람이 자신의 성능을 비교할 수?
Dan

@Dan 이와 같은 경우에는 차이가 없습니다.
Aris

4

한 줄의 코드로 바꾸고 분해하는 방법

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

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

결과를 다음과 같이 출력합니다

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

3

기존 답변에 교장 중 일부를 결합하여

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

그 이유는 이 답변 에서 버그를 발견 했기 때문에 문자열 끝에 쉼표가 있으면 배열의 빈 요소를 반환합니다. 즉

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

결과

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

이 답변 에서 언급 한대로 PREG_SPLIT_NO_EMPTY 를 사용 하여이 문제 를 제거 하여 해결할 수 있지만 일단 수행하면 기술적으로 정규식을 통해 연속적인 쉼표를 제거 할 필요가 없으므로 표현이 단축됩니다.


2

한 줄 정규 표현식 으로이 작업을 수행 할 수도 있습니다

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

1

이 시도:

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

OP는 배열을 원합니다. preg_replace()문자열에서 배열을 생성하지 않습니다. 이것은 잘못된 질문에 대한 정답입니다. 공감.
mickmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');사소한 수정으로 답이 회복됩니다
dreftymac

1

구체적 으로 OP의 샘플 문자열은 일치시킬 각 하위 문자열이 단일 단어이므로 str_word_count ()를 사용할 수 있습니다 .

코드 : ( 데모 )

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

산출:

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

문자 마스크 / 3 번째 매개 변수에 필요한 문자를 추가하여 문자 이외의 부분 문자열 (및 일부 하이픈 및 아포스트로피-글씨를 읽는 경우)에도 적용 할 수 있습니다.

코드 : ( 데모 )

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

산출:

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

다시 말하지만 샘플 문자열 때문에이 질문을 매우 좁게 처리하고 있지만 원하는 동일한 출력을 제공합니다.

코드 : ( 데모 )

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

0

preg_split () 을 사용할 수 있습니다 .

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

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

그게 당신의 요소에 공백에 분할합니다
크리스 KL에게

쉼표를 대괄호 왼쪽으로 이동하면 쉼표가 필요합니다.
Eric Leschinski

쉼표를 왼쪽으로 이동해도 문제가 해결되지 않습니다. 아래 답변을 확인하십시오. stackoverflow.com/a/38300330/5079380
Amr ElAdawy


-11

트림과 폭발

$ str = '빨강, 녹색, 파랑, 주황색';

$ str = 트림 ($ str);

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

print_r ($ strArray);


5
이것은 각 색상 사이가 아니라 문자열의 시작과 끝에서 공백 만 제거합니다.
SeanWM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.