PHP 변수에서 공백을 제거하려면 어떻게해야합니까?


79

주석 PHP.net을 알고 있습니다. tr간단히 실행할 수 있도록 PHP와 유사한 도구를 갖고 싶습니다.

tr -d " " ""

나는 성공적으로 기능 php_strip_whitespace을 실행하지 않습니다 .

$tags_trimmed = php_strip_whitespace($tags);

정규식 기능도 성공적으로 실행하지 못했습니다.

$tags_trimmed = preg_replace(" ", "", $tags);


1
@taztodgmail 날짜를보세요. 이것은 2009 년이고 다른 하나는 2013 년입니다. 2013 년은 이것의 중복입니다.
Léo Léopold Hertz 준영

1
참고 : \ s 플래그에는 utf-8로 인코딩 된 nbsp ;, ps, quads 및 fs stackoverflow.com/questions/2227921/…
ppostma1

1
확실한! 그 주소를 그 코드의 설정
ppostma1

왜 이것이 첫 페이지에 팝업됩니까?
Jonathan dos Santos

답변:


48

정규식은 기본적으로 UTF-8 문자를 고려하지 않습니다. \s메타 문자는 원래 라틴어 세트를 차지한다. 따라서 다음 명령은 탭, 공백, 캐리지 리턴 및 새 줄만 제거합니다.

// http://stackoverflow.com/a/1279798/54964
$str=preg_replace('/\s+/', '', $str);

UTF-8이 주류가됨에 따라이 표현은 새로운 utf-8 문자에 도달하면 더 자주 실패 / 중단되어 설명 \s할 수없는 공백을 남겨 둡니다 .

unicode / utf-8에 도입 된 새로운 유형의 공백을 처리하려면 최신 공백을 일치시키고 제거하는 데 더 광범위한 문자열이 필요합니다.

기본적으로 정규식은 멀티 바이트 문자를 인식하지 않기 때문에 구분 된 메타 문자열 만 사용하여 식별 할 수 있습니다.이를 통해 바이트 세그먼트가 다른 utf-8 문자에서 변경되는 것을 방지 할 수 있습니다 ( \x80쿼드 세트에서 모든 \x80하위 바이트를 대체 할 수 있음). 스마트 따옴표)

$cleanedstr = preg_replace(
    "/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/",
    "_",
    $str
);

이렇게하면 탭, 줄 바꿈, 세로 탭, 용지 공급, 캐리지 리턴, 공백 및 여기 에서 추가로 제거 됩니다 .

다음 줄, 줄 바꿈하지 않는 공백, 몽골어 모음 구분자, [en quad, em quad, en space, em space, 3-per-em 공백, four-per-em 공백, 6-per-em 공백, 그림 공간, 구두점 공백 , 얇은 공간, 머리카락 공간, 0 너비 공백, 0 너비 비 결합 자, 0 너비 결합 자], 줄 구분 기호, 단락 구분 기호, 좁은 비 분리 공백, 중간 수학적 공간, 단어 결합 자, 표의 문자 공간 및 너비 0 비 깨는 공간.

텍스트 검색, 인식을 방해하는 자동화 된 도구 또는 사이트에서 내보낼 때 이러한 많은 부분이 xml 파일에 혼란을 일으켜 파서 가 다음 명령 (단락 및 줄 구분 기호)으로 이동하여 줄 을 발생시키는 PHP 소스 코드에 보이지 않게 붙여 넣을 수 있습니다. "텍스트 전송 질병"이라고 부르기 시작한 간헐적이고 설명 할 수없는 오류가 발생하는 코드를 건너 뛸 수 있습니다.

[웹에서 복사하여 붙여 넣는 것은 더 이상 안전하지 않습니다. 문자 스캐너를 사용하여 코드를 보호하십시오. ㅋㅋ]


1
그렇게? 나는 오래된 것이 더 이상 작동하지 않는다는 것을 설명하려고 노력했습니다
ppostma1

우수한! 세트에있는 캐릭터 수를 포함 해 주시겠습니까? --이렇게하면 해당 캐릭터의 전체 세트가 실제로 있는지 확인하는 데 도움이됩니다. --이전에 받아 들인 답변보다 이제 더 완전하기 때문에 귀하의 답변을 수락했습니다.
Léo Léopold Hertz 준영

@Masi를 도와 주셔서 감사합니다!
ppostma1

1
덕분에, 하지만 사용하여 trim()정답이어야한다
Husam

1
u정규식에 플래그 가 있어야하지 않습니까?

133

스트립에 있는 공백을, 당신은 정규 표현식을 사용할 수 있습니다

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

UTF-8 문자열에서 공백을 처리 할 수있는 것에 대해서는 this answer 을 참조하십시오 .


다른 솔루션. 이것은 (preg_replace) 실패합니다.
Kathir 2013-02-28

Kathir, 어떤 입력으로 실패합니까?
Alex

사람들은 왜 계속해서 +뒤에 넣어 s? 이것을 위해 필요하지 않습니다.
Buttle Butkus 2013

2
그것은이다 그, 빠른 하나씩을 교체하는 것보다 크기 순서 이유 :
폴 딕슨

1
OP의 다른 문제를 해결하려는 것 같습니다. 이것은 문자열에서 모든 공백을 제거하는 솔루션입니다.
Paul Dixon

26

연속 된 공백을 삭제해야하는 경우가 있습니다. 다음과 같이 할 수 있습니다.

$str = "My   name    is";
$str = preg_replace('/\s\s+/', ' ', $str);

산출:

My name is

감사. 정확히 내가 찾던 것
lomse

15
$string = str_replace(" ", "", $string);

나는 preg_replace가 다음과 같은 것을 찾을 것이라고 믿습니다. [:space:]


8

PHP의 트림 기능을 사용하여 양쪽 (왼쪽 및 오른쪽)을 트림 할 수 있습니다.

 trim($yourinputdata," ");

또는

trim($yourinputdata);

당신은 또한 사용할 수 있습니다

ltrim() - Removes whitespace or other predefined characters from the left side of a string
rtrim() - Removes whitespace or other predefined characters from the right side of a string

시스템 : PHP 4,5,7
문서 : http://php.net/manual/en/function.trim.php


1
이것은 기본적으로 OP에서 요구하는 정확한 대답이어야합니다. 트리밍 할 추가 숯을 추가하여 작고 깨끗하며 '확장 가능'합니다.
Louis Loudog Trottier

트림은 문자열 내부의 공백을 제거하지 않고 왼쪽과 오른쪽에서만 제거합니다. BTW, 공백은 트림에서 기본값입니다. 두 번째 인수를 제공 할 필요가 없습니다

6

$ tags에서 모든 공백을 제거하려면 다음과 같이하십시오.

str_replace(' ', '', $tags);

새 줄을 제거하려면 조금 더 필요합니다.


2
결과를 변수에 할당하지 않으면 실제로 유용하지 않습니다.
Paul Dixon

Paul Dixon 변수 란 무엇입니까? 프로그래밍 중이지만 변수가 무엇인지 모르겠습니다. 어떤 용도로 유용합니까? 웹에서 찾을 수 있습니까? 그것이 의미하는 바를 아는 것이 중요합니까? 이름 앞에 $를 넣는 이유는 무엇입니까?
내가 알고 싶어요

2

가능한 모든 옵션은 변수를 파일로 시뮬레이션하기 위해 사용자 정의 파일 래퍼를 사용하는 것입니다. 다음을 사용하여 달성 할 수 있습니다.

1) 우선, 래퍼를 등록하십시오 (파일에서 한 번만 사용하십시오. session_start ()처럼 사용하십시오).

stream_wrapper_register('var', VarWrapper);

2) 그런 다음 래퍼 클래스를 정의합니다 (정말 빠르지 만 완전히 정확하지는 않지만 작동합니다).

class VarWrapper {
  protected $pos = 0;
  protected $content;
  public function stream_open($path, $mode, $options, &$opened_path) {
    $varname = substr($path, 6);
    global $$varname;
    $this->content = $$varname;
    return true;
  }
  public function stream_read($count) {
    $s = substr($this->content, $this->pos, $count);
    $this->pos += $count;
    return $s;
  }
  public function stream_stat() {
    $f = fopen(__file__, 'rb');
    $a = fstat($f);
    fclose($f);
    if (isset($a[7])) $a[7] = strlen($this->content);
    return $a;
  }
}

3) 그런 다음 var : // 프로토콜에서 래퍼와 함께 파일 함수를 사용합니다 (include, require 등에도 사용할 수 있음).

global $__myVar;
$__myVar = 'Enter tags here';
$data = php_strip_whitespace('var://__myVar');

참고 : 변수를 전역 범위에 두는 것을 잊지 마십시오 (예 : 전역 $ __ myVar).


이것은 복잡하고 초보자는 이것을보고 싶지 않을 수도 있습니다. 그러나 노력을 보여주는 나는 -1이 게시물에 삭제 조치 할 수 있도록 당신을 upvote에 있습니다
Ironwind

1
예, 매우 복잡하다는 것을 알고 있지만 작동하며 어떤 경우에는 정말 강력합니다. 그리고 불행하게도 파일로만 작동하는 함수에 변수를 보내는 방법은 (추악한 임시 파일을 만드는 대신) 유일한 방법입니다 (그리고 php_strip_whitespace가 유일한 방법은 아닙니다). 예를 들어, 요구하기 전에 코드를 대체 할 수 있습니다. 원하는 것은 무엇이든 할 수있는 PHP 용 "사전 컴파일러"를 만들 수 있습니다. 나는 그것을 사용하고 수년간의 프로그래밍 동안 매우 강력하고 유용합니다.
micropro.cz

global $$varname;2013 년에는 얼마나 끔찍
했습니까

1

사용하여 할 수 있습니다. ereg_replace

 $str = 'This Is New Method Ever';
 $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
 echo $newstr
 // Result - ThisIsNewMethodEver

ereg는 PHP 5.3부터 더 이상 사용되지 않습니다

1

당신은 또한 preg_replace_callback기능 을 사용 합니다. 이 함수는 preg_replace출력을 조작하는 방법에 대한 더 많은 제어를 제공하는 콜백 함수를 사용할 수 있다는 점을 제외하면 형제와 동일합니다 .

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );

1
솔루션이 작동해야하는 이유에 대한 설명을 추가하는 것이 Stack Overflow에서 좋은 방법입니다. 자세한 내용은 답변 방법을 읽어보십시오 .
Samuel Liew

콜백이 유용한 사례를 추가해 주 preg_replace시겠습니까?
레우 레오폴드 헤르츠 준영

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

1

이것은 오래된 게시물이지만 가장 짧은 답변은 여기에 나열되어 있지 않으므로 지금 추가하고 있습니다.

strtr($str,[' '=>'']);

"이 고양이 피부"를 만드는 또 다른 일반적인 방법은 다음과 같이 폭발 및 폭발을 사용하는 것입니다.

implode('',explode(' ', $str));


0

이전 게시물이지만 다음과 같이 할 수 있습니다.

if(!function_exists('strim')) :
function strim($str,$charlist=" ",$option=0){
    $return='';
    if(is_string($str))
    {
        // Translate HTML entities
        $return = str_replace(" "," ",$str);
        $return = strtr($return, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
        // Choose trim option
        switch($option)
        {
            // Strip whitespace (and other characters) from the begin and end of string
            default:
            case 0:
                $return = trim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the begin of string 
            case 1:
                $return = ltrim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the end of string 
            case 2:
                $return = rtrim($return,$charlist);
            break;

        }
    }
    return $return;
}
endif;

표준 trim () 함수는 HTML 엔티티가 올 때 문제가 될 수 있습니다. 이것이 제가이 문제를 처리하는 데 사용되는 "Super Trim"기능을 작성한 이유입니다. 또한 현의 시작, 끝 또는 부스 쪽에서 트리밍을 선택할 수 있습니다.


0

전체 문자열에서 공백을 제거하는 간단한 방법은 explode 함수를 사용하고 for 루프를 사용하여 전체 문자열을 인쇄하는 것입니다.

 $text = $_POST['string'];
            $a=explode(" ", $text);
            $count=count($a);
            for($i=0;$i<$count; $i++){

                echo $a[$i];
            }

0

\ s regex 인수는 UTF-8 멀티 바이트 문자열과 호환되지 않습니다.

이 PHP RegEx는 UTF-8 문자열 대신 PCRE (Perl Compatible Regular Expressions) 기반 인수를 사용하여이 문제를 해결하기 위해 작성한 것입니다.

function remove_utf8_whitespace($string) { 
   return preg_replace('/\h+/u','',preg_replace('/\R+/u','',$string)); 
}

-사용 예-

전에:

$string = " this is a test \n and another test\n\r\t ok! \n";

echo $string;

 this is a test
 and another test
         ok!

echo strlen($string); // result: 43

후:

$string = remove_utf8_whitespace($string);

echo $string;

thisisatestandanothertestok!

echo strlen($string); // result: 28

PCRE 인수 목록

출처 : https://www.rexegg.com/regex-quickstart.html

Character   Legend  Example Sample Match
\t  Tab T\t\w{2}    T     ab
\r  Carriage return character   see below   
\n  Line feed character see below   
\r\n    Line separator on Windows   AB\r\nCD    AB
    CD
\N  Perl, PCRE (C, PHP, R…): one character that is not a line break \N+ ABC
\h  Perl, PCRE (C, PHP, R…), Java: one horizontal whitespace character: tab or Unicode space separator      
\H  One character that is not a horizontal whitespace       
\v  .NET, JavaScript, Python, Ruby: vertical tab        
\v  Perl, PCRE (C, PHP, R…), Java: one vertical whitespace character: line feed, carriage return, vertical tab, form feed, paragraph or line separator      
\V  Perl, PCRE (C, PHP, R…), Java: any character that is not a vertical whitespace      
\R  Perl, PCRE (C, PHP, R…), Java: one line break (carriage return + line feed pair, and all the characters matched by \v)      

0

태그의 형태로 몇 가지 특별한 유형의 공백이 있습니다. 당신은 사용해야합니다

$str=strip_tags($str);

중복 태그, 오류 태그를 제거하고 먼저 일반 문자열에 도달합니다.

그리고 사용

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

그것은 나를위한 일입니다.

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