문자열에서 줄 바꿈을 제거하고 하나의 빈 공간으로 교체하십시오.


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

문자열에서 모든 새 줄을 제거하고 싶습니다.

나는이 정규식을 가지고 있는데, 그것들을 모두 잡을 수 있습니다. 문제는 내가 어떤 기능을 사용 해야하는지 모르겠다는 것입니다.

/\r\n|\r|\n/

$string 되어야한다 :

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
수천 번의 교체 작업을 수행하는 경우을 사용하지 마십시오 preg_replace. 거의 두 배 느립니다 str_replace.
Alex W

이 독립형 라이브러리에s($str)->normalizeLineEndings('') 있는 것처럼 도움 이 될 수 있습니다 . LF, CR 및 CRLF뿐만 아니라 유니 코드 줄 바꿈도 제거합니다.
caw

답변:


578

이중 줄 바꿈에주의해야합니다. 이렇게하면 이중 공백이 생길 수 있습니다. 이 효율적인 정규 표현식을 사용하십시오.

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

여러 공백과 줄 바꿈이 단일 공백으로 바뀝니다.

편집 : 다른 사람들이 지적 했듯이이 솔루션에는 단어 사이에 단일 줄 바꿈이 일치하는 문제가 있습니다. 이 예에는 나와 있지 않지만 상황이 어떻게 발생할 수 있는지 쉽게 알 수 있습니다. 대안은 다음을 수행하는 것입니다.

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

10
이 솔루션을 사용하기 전에 아래의 답변과 답변에 대한 의견을 참조하십시오. 이 솔루션은 예상대로 작동하지 않을 수 있습니다.
matsolof

1
정규 표현식에서 "\ s 공백 문자 일치"는 개행과 일치하는 이유는 무엇입니까?
Michael Z

2
모든 공백을 제거 / 교체하지만 (이중) 공백이 아닌 솔루션을 찾고있었습니다. 이것은 정규식입니다./(?![ ])\s+/
algorhythm

귀하의 솔루션으로 많은 시간을 절약했다는 사실을 알려 드리고 싶었습니다.
Parthapratim Neog

183

허용 된 답변에 대한 몇 가지 의견 :

+수단 "1 개 이상". 반복 할 필요는 없다고 생각합니다 \s. 나는 당신이 단순히 쓸 수 있다고 생각합니다 '/\s+/'.

또한 문자열에서 공백을 먼저 제거하고 마지막으로 제거하려면을 추가하십시오 trim.

이러한 수정으로 코드는 다음과 같습니다.

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

네가 옳아; /\s\s+/의 줄 바꿈과 일치하지 않습니다 foo\nbar.
Alan Moore

79

그냥 사용 preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

str_replace()코드가 깨끗해 보이지는 않지만이 문제를 해결할 수 있습니다 .

$string = str_replace(array("\n", "\r"), '', $string);

이데 오네에서 생방송보기


1
OP는 "문단"과 "for"사이에 공백을 원합니다. 줄 바꿈 문자 만 제거하면 줄 바꿈 문자가 없습니다.
Daniel Vandersluis

해당 수정하시기 바랍니다$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

그렇지 않으면 더 이상 할 말이 없습니다. 그것이 가장 간단한 답이라고 생각합니다!
erikbwork

3
@erik 그렇다면 "잘못된"것입니다. 그대로 작동합니다.
NullUserException

1
@Vineet 그것은 정규식의 시작과 끝을 나타내는 구분자
일뿐입니다

21
$string = str_replace(array("\n", "\r"), ' ', $string);

3
PHP에서 이스케이프 시퀀스는 큰 따옴표로 묶어야합니다.
Daniel Vandersluis

이것은 OP가 원하는 것을 정확하게 수행하지는 않습니다. 이것은 어려운 답변과 동일하고 \r문자를 제거하지 않기 때문입니다.
NullUserException

@NullUser : 댓글을 올리는 대신 자신의 게시물을 업데이트하지 않는 이유는 무엇입니까?
fabrik

@NullUser : 사실을 제외하고는 모든 것을 ''대신 ''로 바꿉니다.
fabrik

12

속도와 배열에 큰 따옴표를 사용하려면 str_replace를 사용해야합니다

str_replace(array("\r\n","\r"),"",$string);

자원이 적고 완벽합니다.
CONvid19

1
제가 틀릴 수도 있지만이 코드 때문에 이러한 시스템의 새로운 라인은 그냥에서 유닉스 시스템에 새로운 라인 문자를 제거하지 않습니다 \n하지 \r\n게다가 나는 영업 이익은 신규 라인 대신에 하나의 공간을 넣어 요구하고있다 생각
마르코 Demaio

7

이것이 이미 제출 된 답변에 대해 가치가 있는지 확실하지 않지만 게시 할 수 있습니다.

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

6

preg_replace를 사용하여 PCRE 정규식 교체를 수행 할 수 있습니다 : http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

줄 바꾸기를 바꾸거나 공백으로 문자를 반환합니다. 대체하지 않으려면 두 번째 인수를로 변경하십시오 ''.


1
preg기능은 PCRE하지 POSIX, 정규 표현식을 사용합니다. eregPOSIX를 사용 하는 기능이 있지만 이제는 더 이상 사용되지 않습니다.
Daniel Vandersluis

5

이것을 사용하십시오 :

일련의 줄 바꾸기를 빈 문자열로 바꾸십시오.

$string = preg_replace("/[\\n\\r]+/", "", $string);

또는 줄 바꿈을 단일 공백으로 바꾸고 싶을 수도 있습니다.

$string = preg_replace("/[\\n\\r]+/", " ", $string);

코드를 올바르게 포맷하십시오. 이 작업은 관련 줄을 4 칸 들여 쓰기하여 수행됩니다.
jwueller

2
그래서 작은 따옴표를 사용하므로 해당 문자를 이스케이프 할 필요가 없습니다. \\n끔찍해 보인다. \\\\ 단일 백 슬래시와 일치하는 것은 끔찍합니다.
NullUserException

5

이스케이프 시퀀스\R 는 일반 개행과 일치합니다.

즉, 유니 코드에 의해 줄 바꿈 시퀀스 로 간주되는 모든 것 입니다. 여기에는 \v( 세로 공백 ) 과 일치하는 모든 문자 및 다중 문자 순서가 포함됩니다 \x0D\x0A.

$string = preg_replace('/\R+/', " ", $string);

8 비트 비 UTF-8 모드 \R에서 다음과 같습니다. (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 데모


Anton이 내 편집 내용이 올바른지 확인하십시오! 추가 정보가 추가되었습니다.
버블 버블

4

텍스트의 줄 바꿈은 일반적으로 다음과 같이 표시됩니다.

\ r \ n -Windows 컴퓨터에서

\ r -Apple 컴퓨터에서

\ n -Linux에서

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

3

무엇에 관한 것 :

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

내가 틀리지 않으면 \ n이 모든 시스템에서 올바르게 작동하지 않기 때문에 이것은 매우 강력한 솔루션이어야합니다 ...


이것은 \ r을 대체하는 것이 아니라 \ n을 대체하는 것 같습니다 : ideone.com/28KPcb
T30

매뉴얼 PHP_EOL에 언급 된 바와 같이 현재 플랫폼에 대한 올바른 'End Of Line'기호가 포함되어 있습니다. 다른 플랫폼에서 문자열을 가져 오거나 형식이 잘못된 문자열이있는 경우이 문제가 발생할 수 있습니다.
GDY

꽤 폐쇄 된 환경을 가지고 있다면 플랫폼 독립적이고 아마도 성능이 뛰어 나기 때문에 이것이 나에게 가장 우아한 솔루션 인 것 같습니다 ... 가져 오기 / 내보내기 시나리오와 같이 더 광범위한 입력이있는 경우 정규식 솔루션을 사용해야합니다.
GDY

3

나는 정규식에 대해 모든 사람이 얼마나 작은 지 알고 놀랐습니다.

PHP에서 줄 바꿈은

$str = preg_replace('/\r?\n$/', ' ', $str);

펄에서

$str =~ s/\r?\n$/ /g;

의미 줄 바꿈 끝에있는 줄 바꿈 문자 (효율을 위해) (선택적으로 캐리지 리턴이 앞에 옴)를 공백으로 바꿉니다.

\ n 또는 \ 015는 줄 바꿈입니다. \ r 또는 \ 012는 캐리지 리턴입니다. ? 정규식에서 이전 문자의 1 또는 0과 일치 함을 의미합니다. 정규 표현식에서 $는 줄 끝과 일치 함을 의미합니다.

원래의 최고의 정규 표현식 참조는 perldoc perlre입니다. 모든 코더는이 문서를 잘 알고 있어야합니다. http://perldoc.perl.org/perlre.html 참고 모든 기능이 모든 언어에서 지원되는 것은 아닙니다.


이 솔루션은 나에게는 효과가 없었지만 언급했듯이 실제 솔루션을 생성하려면 더 읽어야합니다. 이것이 효과가 없다는 것에 놀랐습니다.
Adam Whateverson

2

이것은 내가 사용할 패턴입니다

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

아마도 이것은 작동합니다 :

$str='\n';
echo str_replace('\n','',$str);

1

이것은 또한 탭을 제거합니다

$string = preg_replace('~[\r\n\t]+~', '', $text);

1

아래 코드를 시도하면 텍스트에 공백과 줄 바꿈이 유지됩니다.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );

1

이러한 솔루션 중 많은 부분이 저에게 효과적이지 않았습니다. 이것은 트릭을 수행했지만 :

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

참조는 다음 같습니다 .- PCRE 및 New Lines


0

아래 코드는 모든 텍스트에서 작동합니다.

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

새 줄과 여러 공백을 제거 할 수 있습니다.

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

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