줄 바꿈으로 PHP 문자열을 분해


253

간단 하죠? 글쎄, 이것은 작동하지 않습니다 :-\

$skuList = explode('\n\r', $_POST['skuList']);

28
작은 따옴표는 "이 문자열을 구문 분석하지 마십시오"를 의미합니다. @ Select0r의 대답은 아마도 당신이 찾고있는 것일 것입니다.
Ryan Kinal

3
새 줄을 제거하고 PHP 문자열에서 반환하는 방법대한 가능한 중복 ? 이것은 이미 복제본으로 문자열다른 것들 로부터 뉴스 라인확실하게 제거 합니다 . 질문을하기 전에 떨리는 검색 기능을 사용하십시오!
Gordon

1
@ Gordon : Ha, 나는 Shrapnel 대령이 다른 질문에서 말한 것을 보았습니다. 실제로 슬프다. 그래도 내 투표를 추가합니다.
BoltClock

9
다른 사람들이 언급 한 작은 따옴표 외에도 CRLF 쌍은 \r\n다른 방법 이 아닙니다.
Powerlord

1
기억하십시오 : \ R etur \ N
l00k

답변:


410

모범 사례

첫 번째 답변에 대한 의견에서 언급했듯이 가장 좋은 방법은 현재 시스템의 EOL ( End Of Line ) 을 나타내는 PHP 상수 PHP_EOL 을 사용하는 것 입니다.

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP는 코드 시스템을 독립적으로 만드는 데 사용할 수있는 매우 유용한 상수 를 많이 제공합니다. 이 링크 를 참조 하여 유용하고 시스템 독립적 인 디렉토리 상수를 찾으십시오.

경고

이러한 상수는 페이지 시스템을 독립적으로 만들지 만 다른 시스템에 저장된 데이터로 상수를 사용할 때 한 시스템에서 다른 시스템으로 이동할 때 문제가 발생할 수 있습니다. 새로운 시스템의 상수가 이전 시스템의 상수와 다를 수 있으며 저장된 데이터가 더 이상 작동하지 않을 수 있습니다. 따라서 데이터를 저장하기 전에 데이터를 완전히 구문 분석하여 시스템 종속 부품을 제거하십시오.

최신 정보

Andreas의 의견에 따르면 여기에 제시된 '모범 사례'솔루션은 설명 된 사용 사례에는 적용되지 않습니다. 서버의 EOL (PHP)은 브라우저 (모든 OS)가 사용하는 EOL과 관련이 없습니다. 그러나 그 (브라우저)는 문자열이 나오는 곳입니다.

따라서 @Alin_Purcaru ( three down ) 의 솔루션을 사용하여 모든 기지를 덮고 그의 대답 을 찬성 하십시오.

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

5
이것은 새로운 답변이지만 아마도 가장
훌륭하고

PHP가 원하는 방식이기 때문에 이상합니다. :) OS 및 PHP 버전에 대한 자세한 내용을 알려줄 수 있습니까? PasteBin 또는 sth의 일부 코드 일 수 있습니다. 비슷한?
Larzan

16
시스템과 입력 소스는 서로 관련이 없으므로 PHP_EOL을 사용할 수 없습니다. 사용자가 Windows에 줄을 바꾸고 Linux에서 PHP를 실행하면 결과가 깨질 수 있습니다.
barell

1
@barell 정확하게, 그것은 '경고'부분에서 설명하는 상황입니다.) 질문은 데이터베이스에 저장된 오래된 입력이라고 명시 적으로 언급하지 않았습니다. '경고'부분을 읽으면 거기에서 해당 상황을 다루는 것을 볼 수 있습니다.
Larzan

7
이 답변은이 유스 케이스에 대해서만 잘못되었습니다. 이 경우 PHP_EOL 상수를 사용하지 마십시오. 입력 소스 (예 : 사용자 브라우저)는 시스템이 아닙니다. 모든 다른 줄 끝을 처리하는 솔루션을 사용하십시오 (Alin Purcaru의 답변).
Andreas

241

모든 경우를 커버하십시오. 입력 내용이 Windows 환경에서 제공되는 것에 의존하지 마십시오.

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

또는

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

21
eol이 인 경우 빈 배열 요소가 \r\n됩니다. 그것을 방지하기 위해, 하나를 사용 : preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(주 \r\n또는 단순히를 넣어 그 플래그를 사용할 때 불필요하게) \r\n 전에\r :preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY는 훌륭하지만 빈 줄을 삭제합니다. 이것은 바람직하거나 바람직하지 않을 수 있습니다.
jms

이 패턴은 아무 것도 없어도 성공하기 때문에 모든 문자와 일치합니다. "?" 는 0 또는 1 회를 의미하므로 \ r 및 \ n이 모두없는 경우에도 일치 할 수 있습니다. 당신은 "고정"이라고 말하지만 나는 그것을 보지 못합니다. 대신 / (\ r | \ n) + /를 사용했습니다.
Rolf

1
@Rolf 서둘러 편집 한 것 같습니다. 지금 수정했습니다. 사용해야 할 것은 출력에 빈 줄을 원하는지 여부에 따라 다릅니다. 내 답변의 옵션도 빈 줄을 반환합니다.
Alin Purcaru

3
@AlinPurcaru 답을 통해 어느 쪽이 둘 다 공백을 반환하고 어느 쪽이 공백을 반환하지 않을 것인지 명확히 할 수 있습니까?
Patrick

150

"\n\r"(큰 따옴표) 또는 그냥 시도하십시오 "\n".

사용중인 EOL 유형이 확실하지 않은 경우 분해하기 전에 str_replace를 실행하여 "\ n \ r"을 "\ n"으로 바꾸십시오.


52
PHP에서 작은 따옴표는 "이 문자열을 구문 분석하지 마십시오"를 의미합니다. 즉, 제어 문자가 구문 분석되지 않고 리터럴 (줄 바꿈 및 캐리지 리턴이 아니라 실제 리터럴 '\ n \ r')으로 간주됩니다. 큰 따옴표를 사용하면 "이 문자열 구문 분석"을 의미하므로 제어 문자가 구문 분석됩니다. +1
Ryan Kinal

17
/n/r? 나는 OP가 썼다는 것을 알고 있지만 올바른 창 eol은\r\n
webbiedave

20
PHP 줄 끝 상수를 고려하십시오 PHP_EOL.
Daniel W.

안녕하세요 여러분, 이것이 정답입니다! @Alin Purcaru의 답변이 44 표를 얻은 이유가 궁금합니다. 비록 그것이 일을하는 것처럼 보이지만 항상 올바르게 작동하지는 않습니다. 그래서 여기 같은 일을 고수하는 사람에 대한 나의 의견이 있습니다
Rafik Bari

3
\ r을 무시하고 \ n없이 사용하는 마지막 OS는 OS9 ( en.wikipedia.org/wiki/Newline#Representations )입니다. 그러므로 이것은 당신에게 최상의 결과를 줄 것입니다 :explode("\n", str_replace("\r", '', $string));
DanielM

15

여기에 많은 것들이 있습니다.

  • 작은 따옴표가 아닌 큰 따옴표를 사용해야합니다. 그렇지 않으면 이스케이프 된 문자가 이스케이프되지 않습니다.
  • 정상적인 순서는 \r\n아닙니다 \n\r.
  • 소스에 따라, 당신은 단지 받고 할 수 \n없이 \r(또는 특별한 경우에, 아마도 단지 \r)

마지막으로, preg_split()가능한 모든 변형을 사용하면보다 안정적인 데이터 분할 방법을 제공 할 수 있습니다 explode(). 그러나 대안 explode()으로 just과 함께 \n사용 trim()하고 \r남은 문자 를 제거하는 데 사용할 수 있습니다.


좋은 대답입니다. 간결하고 모든 것을 다룹니다. 감사!
코스타 콘 토스

11

이 PHP 함수는 줄 바꿈으로 문자열을 확장합니다.

주의 : Windows의 새 줄 은 \ r \ n 이고 LinuxUnix\ n입니다.
이 함수는 모든 새 줄을 Linux 모드로 변경 한 다음 분할합니다.
빈 줄은 무시됩니다주의

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}


$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

산출

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)


6

새로운 라인의 경우

$list = explode("\n", $text);

줄 바꿈 및 캐리지 리턴의 경우 (Windows 파일에서와 같이) 게시 한대로입니다. skuList가 텍스트 영역입니까?


4

를 놓고 \n따옴표 :

explode("\n", $_POST['skuList']);

내가 잘못 아니에요 경우 따옴표에서, 이것은으로 처리 \하고 n별도.



3

완벽하지는 않지만 가장 안전해야한다고 생각합니다. nl2br 추가 :

$skuList = explode('<br />', nl2br($_POST['skuList']));


1

보이는 것처럼 쉬운

$skuList = explode('\\n', $_POST['skuList']);

정확한 텍스트 "\ n" 을 전달하면됩니다. \ n을 직접 쓰는 것은 이스케이프 시퀀스로 사용됩니다. 따라서 "\\" 는 간단한 역 슬래시를 전달한 다음 "n" 을 넣습니다.


0

우선, 나는 그것이 \r\n모든 시스템에서 동일하지는 않다고 생각합니다 . 그것은 창문에서만 작동합니다. 다른 시스템이 다른 라인을 다르게 취급하기 때문에 새로운 라인을 교체하는 방법을 알아내는 것은 성가신 일입니다 ( 여기 참조 ). 당신은 그냥 더 나은 행운을 가질 수 있습니다 \n.


0

다른 사람이 이것을 시도했지만 작동하지 않았다면, 이것은 당신이 나와 같은 뇌 방귀를했을 수도 있음을 상기시킵니다.

mysql이 먼저 문자열을 이스케이프 했습니까? 이 경우, 개행 문자는 더 이상 개행 문자가 아닙니다.

구문 분석을 피하기 위해 아무것도하지 않았으며 '\ n'( 실제 줄 바꿈 문자 대신 문자 그대로 백 슬래시 및 n)으로 조정하고 폭발했습니다 .


3
mysql 이스케이프 후 문자열 조작을하는 것은 전혀 의미가 없습니다.
Common Sense

0

입력 텍스트 상자에서 줄 바꿈이 손실됩니까?
나를 위해 더 빨리 작동하는 것은 텍스트 또는 Excel 또는 HTML 테이블 유형 또는 줄 바꿈 유형의 데이터를 복사하여 inputextbox 대신 텍스트 영역에 붙여 넣는 것입니다. 이렇게하면 줄 바꿈이 POST에서 그대로 유지됩니다.

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

수신 파일 형식 :

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];

0

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

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

0

PHP_EOL 크로스 플랫폼 호환 방식으로 개행 문자를 찾기 위해 표면 상으로 사용되므로 DOS / Unix 문제를 처리합니다.

이 시도:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);

0

정규식으로 시도해 볼 수 있습니다.

$skuList = explode('/[\r\n]+/', $_POST['skuList']);


0

여기 나를 위해 일한 것이 있습니다. PHP 7.0 및 PHP 5.6에서 테스트되었습니다.

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.