배열에 문자열을 새 줄로 나눌 수 있습니까?


220

데이터베이스에 줄 바꿈이있는 문자열이 있습니다. 해당 문자열을 배열로 변환하고 모든 줄마다 배열에서 한 인덱스 위치로 이동합니다.

문자열이 다음과 같은 경우 :

My text1
My text2
My text3

내가 원하는 결과는 다음과 같습니다.

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

1
PHP를 모르지만 일반적으로 문자열에 "split"이라는 함수가 있습니다. 다음과 같이 작동합니다 : array = split (string, "\ n")
Sedat Kapanoglu

개행을 먼저 정규화해야합니다. 이 방법 s($yourString)->normalizeLineEndings()은 다른 유용한 문자열 도우미가 많은 github.com/delight-im/PHP-Str (MIT 라이센스 하의 라이브러리)에서 사용할 수 있습니다 . 소스 코드를 살펴볼 수 있습니다.
caw

답변:


290

explode" \n"를 구분 기호로 사용하여이 기능을 사용할 수 있습니다 .

$your_array = explode("\n", $your_string_from_db);

예를 들어,이 코드가 있다면 :

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

이 출력을 얻을 수 있습니다 :

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


큰 따옴표로 묶인 string 을 사용해야 하므로 \n실제로 줄 바꿈으로 해석됩니다.
(자세한 내용은 해당 매뉴얼 페이지를 참조하십시오.)


52
대신에 \n미리 정의 된 상수를 사용할 수 있습니다 PHP_EOL.
Tim

40
모든 줄 바꿈에서 작동하지는 않으므로이 솔루션에주의하십시오. 나는 David의 답변으로 가장 성공했습니다
Maurice

1
모든 종류의 텍스트를 처리하려면 \ n 또는 \ r로 분할해야합니다. 이것은 Linux 및 Windows 줄 바꿈에서만 작동합니다. Mac 줄 바꿈은 무시됩니다! (\ r)
Steve Horvath 2016 년

1
Tims answer / comment가 옳지 않은 것 같습니다. 왜냐하면 이것이 시스템의 줄 바꿈과 일치하기 때문이지만 다른 시스템에서 줄 바꿈이있는 문자열을 얻으면 작동하지 않습니다! 이메일이 문제가 있었다
아사라

7
이 답변과 해당 답변에 대한 의견은 잘못되었습니다. 이것은 OS 개행 문자를 고려하지 않기 때문에 특히 그렇지 않습니다 PHP_EOL. 를 사용해야합니다 preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84

330

나는 항상 이것을 큰 성공으로 사용했습니다.

$array = preg_split("/\r\n|\n|\r/", $string);

(@LobsterMan 덕분에 최종 \ r로 업데이트 됨)


11
이 답변은 파스칼 대신 맨 위에 있어야합니다. 그것은 모든 경우에 효과가 없었습니다.!
Jithesh Kt

1
이것이 답입니다. 검증 된 것은 잘못입니다. 음, hesselbom도이 기능을 사용할 수 있습니다. preg_split ( '/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); 아름다움을 위해 :) 왜 이것이 유일한 좋은 대답입니까? Mac (\ r), Windows (\ r \ n) 또는 Unix (\ n)와 같은 줄 끝 유형을 가정 할 수 없기 때문입니다.
Ninj

2
\R 일치 \n , \r그리고\r\n
mpen

1
짧게/\r?\n/
Jason Schilling

이 예는 단일 문자를 기반으로하는 분할 작업을 수행 할 수 없기 때문에 정확합니다. 이렇게하면 '\ r'또는 '\ n'에서 트리거하면 Windows "\ r \ n"종료시 불필요한 빈 줄이 생깁니다. 두 문자로 된 Windows 구분 기호를 먼저 테스트하는 것이 중요합니다.
AndresRohrAtlasInformatik

281

줄 바꿈은 \ r \ n, \ r 또는 \ n 플랫폼마다 다르게 정의됩니다.

RegExp를 사용하여 문자열을 분할하면 세 가지를 모두 \ R과 일치시킬 수 있습니다

그래서 당신의 문제를 위해 :

$array = preg_split ('/$\R?^/m', $string);

그것은 Windows, Mac 및 Linux의 줄 바꿈과 일치합니다!


3
나는이 답변을 받아 들인 대답과 다른 스레드 대신에 이것을 사용했습니다. 이 의견을 유익한 정보로 남겨 두십시오.
세스 말라 키

3
실제로 이것은 나를 위해 작동하지 않았습니다. 때로는 배열 키에 여전히 줄 바꿈이 있습니다.
Maurice


32
그냥 사용하십시오$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
때때로 작동하지 않습니다! preg_split("/\r\n|\n|\r/", $string)더 나은 선택
Alexey B.

34

PHP는 이미 현재 시스템의 개행 문자를 알고 있습니다. EOL 상수를 사용하십시오.

explode(PHP_EOL,$string)

18
예. 그러나 파일을 편집하거나이 예에서와 같이 Windows의 db 항목을 Linux 시스템에서 사용할 수 있습니다. 일반적인 접근 방식이 더 적합하다고 생각합니다.
Cranio

나는 이것이 옳지 않다. 웹 페이지의 텍스트 영역이 제출되면 서버 운영 체제가 아닌 사용자의 브라우저에 따라 다른 줄 끝 문자를 가질 수 있습니다. 따라서 어떤 OS를 사용하든 무엇이든 파싱 할 수 있어야합니다. 이것은 물론 웹 작업을하고 있다고 가정합니다.
Magmatic

그런 다음 trim()불필요한 공백을 제거하기 위해 결과 문자열을 사용해야 할 수도 있습니다 .
Tim

30

에 대한 대안 다비즈 응답 (빠른 방법) 빠른 사용하는 것입니다 str_replaceexplode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

무슨 일이 일어나고 있습니다 :
줄 바꿈은 다른 형태로 나올 수 있기 때문에 str_replace대신 \ n을 사용하여 \ r \ n, \ n \ r 및 \ r을 사용할 수 있습니다 (원래 \ n은 유지됩니다).
그런 다음 폭발하여 \n모든 줄을 배열로 만듭니다.

나는이 페이지의 src에서 벤치 마크를하고 for 루프에서 1000 번 라인을 나누고
preg_replace평균 11 초가
str_replace & explode걸렸다. 평균 약 1 초가 걸렸다.

내 포럼에 대한 자세한 내용과 벤치 마크 정보


귀하의 포럼 링크 (및 전체 도메인)가 다운 된 것 같습니다
Nikita 웃

19

David : 좋은 방향이지만 \ r을 놓쳤습니다. 이것은 나를 위해 일했다 :

$array = preg_split("/(\r\n|\n|\r)/", $string);

11

줄 바꿈으로 문자열을 배열로 나누기 위해 preg_ * 함수, preg 패턴 또는 str_replace 등이 필요하지 않습니다. 모든 시나리오에서 Linux / Mac이든 m $이든 상관 없습니다.

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL 은 서버 플랫폼에서 사용하는 줄 바꿈 문자를 보유하는 상수입니다.


3
파일은 다른 새로운 라인을 가진 다른 시스템에서 나올 수 있습니다. 특히 넷 환경에서는 PHP가 사용됩니다
.

이것이 바로이 상수가 존재하는 이유입니다. 그리고 특정 문제를 처리합니다.
Spooky

Windows에서 파일을 가져 오면 unix 또는 mac의 파일과 동일하지 않습니다.
Luca C.

항상 순수 utf-8을 사용하고 어디에서나 utf8 파일이 정상적으로 포함되어 있고 줄 바꿈 감지를 위해 Yours 코드 안에 PHP_EOL 이외의 것이 없으면 설명대로 일치하며 예기치 않은 동작이 발생하지 않습니다. 내가 소리를 지르고 주장하는 것만이 아니라는 것을 명심하십시오. PHP_EOL의 유용성이 확인되었습니다.
Spooky

1
귀하의 경우 소스가 다른 곳에서 왔고 잘 형성되지 않은 경우 str_replace (regexp보다 빠름)를 사용하는 것이 좋습니다. ... 대체로 정규 표현식이 될 것입니다. 또는 str_replace 또는 PHP_EOL, "만약 작동하면 만지지 마십시오!"라는 오래된 문장이 있습니다. :)
Spooky


9

StackOverflow는 hesselbom의 답변 (평판이 충분하지 않음)에 대해 언급 할 수 없으므로 내 자신을 추가하고 있습니다 ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

이것은 선행 (두 번째 \ s *) 및 후행 (첫 번째 \ s *) 공백을 자동으로 제거하고 빈 줄 (PREG_SPLIT_NO_EMPTY 플래그)을 건너 뛰기 때문에 나에게 가장 효과적이었습니다.

-= 옵션 =-

선행 공백을 유지하려면 두 번째 \ s *를 제거하고 대신 rtrim ()으로 만드십시오.

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

빈 줄을 유지 해야하는 경우 NULL (자리 표시 자 만)과 PREG_SPLIT_NO_EMPTY 플래그를 제거하십시오.

$array = preg_split('/\s*\R\s*/', trim($text));

또는 선행 공백과 빈 줄을 모두 유지하십시오 ...

$array = preg_split('/\s*\R/', rtrim($text));

왜 공백을 계속 남기고 싶은지 알 수 없으므로 첫 번째 \ s *를 남겨 두는 것이 좋습니다. 그러나 원하는 모든 것이 줄 바꿈으로 제목을 나누는 것이라면 (Jan Goyvaerts가 언급 한 것처럼) 간단합니다 ...

$array = preg_split('/\R/', $text);

m정말 필요하지 않습니다 수정은 무엇입니까? 에만 영향을주지 않습니다 ^$?
mpen

@mpen 예, 당신이 맞다고 생각합니다. 방금 hesselbom 버전과 함께 가지고 다녔습니다. 게시물을 수정하겠습니다.
Deen Foxx

7
<anti-answer>

다른 답변이 지정한대로 사용하십시오 explode보다는 splitPHP 5.3.0 때문에 split사용되지 않습니다. 즉, 다음은 원하는 방식 이 아닙니다 .

$your_array = split(chr(10), $your_string);

LF = "\ n"= chr (10), CR = "\ r"= chr (13)

</anti-answer>

3

crontab에 cronjob을 표시하고 각 줄을 분리하는 방법에 좌절하는 사람은 explode를 사용하십시오.

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

'\ n'을 사용하면 작동하지 않는 것 같지만 chr (10)은 훌륭하게 작동합니다. : D

이것이 두통을 덜어주기를 바랍니다.


안녕 제프, SO에 오신 것을 환영합니다. 다른 사람의 질문에 대한 답변이 아니라 질문과 답변으로 다시 작성해야합니다. 일반 포럼이 아닌 Q & A 사이트입니다. - 자주 묻는 질문을 살펴 가지고 stackoverflow.com/faq
레베카 스콧

사용 '\n'이스케이프 시퀀스는 작은 따옴표로 해석되지 않기 때문에 작동하지 않습니다, 대신 큰 따옴표를 사용해야합니다 : "\n"대신 'n'읽기 php.net/manual/en/language.types.string.php
크리스토퍼 K.

2

이것을 사용할 수 있습니다 :

 \str_getcsv($str,PHP_EOL);

2

줄 바꿈이 다음과 같이 변경되도록 $ string = nl2br ($ string)을 수행 할 수 있습니다

<br />. 

이 방법으로 시스템이 \ r \ n 또는 \ n 또는 \ r을 사용하는지는 중요하지 않습니다

그런 다음 배열로 공급할 수 있습니다.

$array = explode("<br />", $string);

참고 : nl2br 은 줄 바꿈을 대체하지 않습니다. 각 줄 바꿈 앞에 끊기 태그 만 삽입합니다. 따라서 첫 번째 배열 이외의 모든 배열 항목은 줄 바꿈으로 시작합니다. 그것이 당신에게 중요하지 않다면,이 방법이 가장 빠릅니다. 그것이 중요 하다면 Jakar의 답변 이 가장 빠릅니다.
Aust

2

그건 내 방법:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

이것은 또한 모든 빈 줄을 건너 뜁니다.


1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

실제 배열 :

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

온라인 퍼가기 :

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


이 답변이 현재 문제를 해결하는 데 OP에 도움이되는 방법에 대한 답변이 포함 된 설명을 추가하십시오.
ρяσѕρєя K

1

PHP 문서에서 이것을 선택했습니다.

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>

0

이 방법은 항상 저에게 효과적입니다.

$uniquepattern="gd$#%@&~#"//Any set of characters which you dont expect to be present in user input $_POST['text'] better use atleast 32 charecters.
$textarray=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['text'])));

1
코드의 일부로 욕설을 좋아하십시오. :) 어쨌든 \ n으로 바꾸는 것이 더 간단하고 안전합니다 (다른 답변을보십시오).
Stefan Reich

0

'기본'패키지 만 사용하는 것도 간단한 경우에 대한 솔루션입니다.

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

-6

\nPHP를 사용하여 문자열이나 줄 바꿈 사이에 특수 문자를 사용하면 이를 달성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.