여러 공백 제거


208

$row['message']MySQL 데이터베이스에서 가져오고 있으며 모든 공백을 제거해야합니다 \n \t.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

다음 형식이어야합니다.

$row['message'] = 'This is a Text and so on Text text.';

나는 시도했다 :

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

하지만 제거하지 않습니다 \n또는 \t, 단지 하나의 공간. 누구든지 그 방법을 말해 줄 수 있습니까?


1
줄 바꿈 및 탭 문자는 작은 따옴표로되어 있으므로 문자 그대로 사용 하시겠습니까?
Mark Lalor

코드 인용 부호를 \ n 및 \ t로 인용 부호를 큰 따옴표로 변경하여 수정했습니다.
Buttle Butkus

답변:


394

당신이 필요합니다 :

$ro = preg_replace('/\s+/', ' ',$row['message']);

사용 \s\s+하는 공백 (공백, 탭 또는 줄 바꿈) 뒤에 하나 이상의 공백이 있습니다. 효과적으로 두 개 이상의 공백을 단일 공백으로 바꾸는 것을 의미합니다.

원하는 것은 하나 이상의 공백을 단일 공백으로 바꾸는 것이므로 패턴을 사용 \s\s*하거나 \s+(권장)


1
그의 방법이 이것보다 낫습니다. 왜 한 공간을 한 공간으로 바꾸겠습니까?
nickf February

16
또한 \ n과 \ t를 공백으로 바꾸길 원합니다. 이제 그의 패턴은 이것과 일치하지 않습니다. $ x = "does \ nthis \ twork"; OP는 모든 공백을 단일 공백으로 바꾸길 원합니다.
codaddict

@ codaddict, 어떻게 \ n을 유지하고 문자열에서 다른 여러 공간과 탭을 제거 할 수 있습니까? 도와주세요
Mansoorkhan Cherupuzha

"\ s +"가 권장되는 이유를 더 구체적으로 설명 할 수 있습니까?
Isius

6
PHP \s에서는 "수직 탭"을 포함하지 않습니다 chr(11). 그것을 포함시키기 위해서는 space캐릭터 클래스 를 사용해야 합니다 : [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav

68
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

이 출력

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present

3
당신은 진정한 생명의 은인입니다. 창문이 이것 위로 튀어 나오려고 했어요.
bikey77

깔끔한 여전히 도움이
spekulatius

16
preg_replace('/[\s]+/mu', ' ', $var);

\s 이미 탭과 줄 바꿈이 포함되어 있으므로 위의 정규 표현식으로 충분합니다.


2
안에 대괄호가 하나만 있으므로 여기에 대괄호는 필요하지 않습니다. 는 /m전혀 없다으로 영향을 실 거예요 ^또는 $앵커와는 /u입력 문자열이 아닌 경우 약간 속도를 느리게하고 죽을 제외하고는 영향을주지 않습니다 유효한 UTF-8 (무엇에 영향을주지 않습니다 \s일치하지만 그것이 영향을 \pZ).
thomasrutter

12

하나의 기능으로 단순화 :

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

Danuel O'Neal의 답변을 바탕으로합니다.


7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);

2
이것은 나를 위해 최선을 다한 것입니다. 또한 문자열의 시작과 끝에서 공백을 지우는 트림을 추가합니다.
Dziamid

당신은 트림을 할 수 @Dziamid (preg_replace이다 (...))
발라 즈 바르

7

여기서 문제를 복제 할 수 없습니다.

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

나는 그것이 단지 전사 오류인지 아닌지 확신 할 수 없지만, 귀하의 예에서는 작은 따옴표로 묶인 문자열을 사용하고 있습니다. \n그리고 \t당신은 이중 인용 문자열을 가지고있는 경우에만 새로운 라인과 탭으로 처리됩니다. 그건:

'\n\t' != "\n\t"

편집 : Codaddict가 지적했듯이 \s\s+단일 탭 문자를 대체하지 않습니다. 그래도 사용하는 \s+것이 효율적인 솔루션 이라고 생각하지 않으므로 대신 어떻게 해야합니까 ?

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);

2
+1, 맞습니다. 단일 공백이 많은 문자열 (대개 경우)은 공백을 공백으로 바꾸는 것이 비효율적입니다.
codaddict

1
@ coaddict : 가설을 테스트하기 위해 각 교체 1000 회를 실행하고 각각의 타이밍을 확인하는 빠른 스크립트를 작성했습니다. 문자열 '+1의 경우 True. 단일 공백이 많은 문자열 (대개 경우)은 공백을 공백으로 바꾸는 것이 비효율적입니다. – codaddict Feb 24 \ '10 at 13:32 ' , 천 \ s + preg_replace () 호출은 0.010547876358032 초가 걸리고 천 (? : \ s \ s + | \ n | \ t) preg_replace () 호출은 0.013049125671387으로 이루어졌습니다. 거의 30 % 느려집니다.
Joseph Cheek

일부 컴퓨터는 자체적으로 단일 "\ r"를 사용하므로 마지막 예제에 "\ r"을 추가 할 수 있습니다 (Apple Mac?)
thomasrutter

4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

이렇게하면 모든 탭, 모든 줄 바꿈 및 여러 공백, 탭 및 줄 바꿈의 모든 조합이 단일 공백으로 바뀝니다.


4
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);

정적 함수 remove_whitespace는 어떤 이유로입니까? 정의했지만 사용하지 마십시오.
Lukas Liesis 11:29에

이들은 각각 용도가 있지만 여러 연속 공백을 하나만 바꾸는 것이 무엇인지 묻지 않습니다. "remove_doublewhitespace"는 동일한 공백 문자의 여러 개만 대체 하므로 "\ n \ n \ n"을 ''로
바꾸지 만

4

preg_replace ()없이

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;

2

이 코드와 패턴을 사용합니다.

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

http://writecodeonline.com/php/에서 테스트 할 수 있습니다


그것은이 쿼리에서 mariaDB에서도 나와 함께 작동합니다 : SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 그래서 고마워요
jalmatari

1

다음과 같이 실행하면됩니다.

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.

1

이것이 내가 사용하는 것입니다 :

ㅏ. 큰 따옴표를 사용하십시오 (예 :

$row['message'] = "This is   a Text \n and so on \t     Text text.";

비. 여분의 공백을 제거하려면 다음을 사용하십시오.

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

가장 빠른 솔루션은 아니지만 코드가 가장 적게 필요하며 작동해야한다고 생각합니다. 그래도 mysql을 사용한 적이 없으므로 잘못되었을 수 있습니다.


1

사실, 다음과 같은 것을 원한다고 생각하면 :

preg_replace('/\n+|\t+|\s+/',' ',$string);

1

여러 탭을 단일 탭으로 바꿉니다.

preg_replace("/\s{2,}/", "\t", $string);

-2

preg_replace없이 루프의 도움으로.

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
    if (isset($str_arr[$i + 1])
       && $str_arr[$i] == ' '
       && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
    } 
    else {
      continue;
    }
}

 echo implode("", $str_arr) ; 

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