문자열 내에서 여분의 공백 제거


132

데이터베이스 쿼리에서 문자열을받은 다음 CSV 파일에 넣기 전에 모든 HTML 태그, 캐리지 리턴 및 줄 바꿈을 제거합니다. 유일한 것은 , 문자열 사이 에서 여분의 공백 을 제거하는 방법을 찾을 수 없다는 것입니다 .

내부 공백 문자를 제거하는 가장 좋은 방법은 무엇입니까?


6
원본 문자열과 원하는 문자열의 샘플을 게시하십시오.
Zote

최종 출력이 어떻게 필요한지 정리할 수 있습니까? CSV 데이터에 쉼표를 삽입하고, 이미 쉼표가있는 데이터베이스에서 가져오고, CSV 삽입을 처리하는 함수에 문자열을 제공하는 등의 작업을하고 있습니까?
Frank DeRosa

마지막 출력은 각 단어가 하나의 공백으로 분리 된 문자열이어야합니다. 현재 여러 공백입니다.
joepour 2009

1
@ 조, 나는 시간을 낭비하지 않고 전에 당신을 도와 준 모든 사람들에게 신용을주기 시작합니다! :)
Frankie

답변:


286

정확히 원하는 것이 확실하지 않지만 다음 두 가지 상황이 있습니다.

  1. 방금 초과를 처리하는 경우 whitespace사용할 수있는 문자열의 시작이나 끝에서 trim(), ltrim()또는 rtrim()제거 할 수 있습니다.

  2. 문자열 내에서 여분의 공백을 처리 하는 경우 단일 공백 preg_replace을 여러 개 고려하십시오 .whitespaces " "*whitespace " "

예:

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

62
$ foo = preg_replace ( '/ \ s + /', '', $ foo);
genio

의 사용 $foo = preg_replace( '/\s+/', ' ', $foo );을 죽일 것입니다nl2br()
Waiyl Karim

1
preg_replace를 사용하기 전에 nl2br을 사용하면 좋습니다.
Lukas Liesis

코드가 당신을 위해 여분의 공백을 제거하지 않는 경우 - - 오타 / 탈옥수 노트는 "S": 일부 온라인-PHP-테스트 페이지를 제거 :) 전에 "\"가 있는지 확인
jave.web

이것은 CSS 안전해야합니까? 에서와 같이 긴 다중 행 CSS 문자열을 보유하는 변수를 안전하게 압축합니까?
David

50
$str = str_replace(' ','',$str);

또는 밑줄로 바꾸십시오. & nbsp; 등


7
모든 공백이 제거됩니다. 그는 문자열을 정규화하려고합니다.
Svend

12
내가 찾던 것 (질문은 아니었지만)
Sevenearths

@Gigala "내부 공백 문자를 제거하는 가장 좋은 방법은 무엇입니까?" 질문이었습니다. 이 답변은 그것을 완벽하게 충족시킵니다.
Cory Dee

1
@CoryDee 마지막 한 문장에 대해서는 사실입니다. 그러나 소개에서이 질문은 " 과잉 공백" 으로 표현되며 초과 를 강조합니다. 당신은 OP의 실제 문제를 만족하게되었으므로 별 문제가되지는 않지만 기술적 인 문제가있는 한 ...
Spencer Ruskin

이는 경우에 작동하지 않습니다 계수공간 이다 짝수 : 말을하자 Hi Earth4 개 공간 사이가 될 것이다 HiEarth. 이것은 질문과 관련된 내 문제를 해결하지 못합니다.
JJ Labajo '

26

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

위의 코드 줄은 추가 공백과 선행 및 후행 공백 을 제거 합니다.


25

다른 예제 중 어느 것도 나를 위해 일하지 않았 으므로이 예제를 사용했습니다.

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

이것은 모든 탭, 줄 바꿈, 이중 공백 등을 단순한 1 공백으로 대체합니다.


감사합니다, @ wp78de 그러나 어떤 이유로 든 문제가 있습니다 \s+. 2014 년에 다시 돌아 왔지만 변경되었을 수도 있지만 지난 3 년 동안 PHP를 만지지 않았으며 의견을 제시 할 수는 없지만 해결책 인 동안 현재 답변을 남기고 여전히 일부 경우에있을 수 있습니다.
Lukas Liesis 3

9

당신은 예를 들어, 문자열 만 여러 공백을 대체 할 경우 : "this string have lots of space . " 그리고 당신은 답이 될 것으로 기대 "this string have lots of space", 당신은 다음과 같은 솔루션을 사용할 수 있습니다 :

$strng = "this string                        have lots of                        space  .   ";

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

echo $strng;

5

사용자 입력 (또는 다른 신뢰할 수없는 소스)에서 페이로드를 얻는 경우 preg_replace () 사용에 대한 보안 결함이 있습니다. PHP는 eval ()을 사용하여 정규 표현식을 실행합니다. 들어오는 문자열이 제대로 위생 처리되지 않으면 응용 프로그램에 코드 삽입이 발생할 위험이 있습니다. 있습니다.

내 자신의 응용 프로그램에서는 입력을 위생 처리하지 않고 짧은 문자열 만 처리하는 대신 약간 더 많은 프로세서 집약적 기능을 만들었지 만 아무것도 평가하지 않기 때문에 안전합니다.

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

'e'수정자를 지정한 경우에만 eval을 사용하여 실행합니다 : php.net/manual/en/… 또한이 기능은 "PHP 5.5.0에서 더 이상 사용되지 않으며 PHP 7.0.0부터 제거되었습니다."라고 표시되어 있습니다. " 따라서 더 이상 preg_replace에서 물건을 평가할 수 없습니다.
ADJenks


2

당신이 사용할 수있는:

$str = trim(str_replace("  ", " ", $str));

이렇게 하면 문자열의 양쪽에서 여분의 공백제거 되고 문자열 내에서 두 공백이 하나로 변경 됩니다. 이렇게하면 연속으로 3 개 이상의 공백이 1 개로 변환되지 않습니다. 내가 제안 할 수있는 또 다른 방법은 더 안전하지만 완전히 최적이 아닌 폭발과 폭발을 사용하는 것입니다!

$str = implode(" ", array_filter(explode(" ", $str)));

내 제안은 네이티브 for 루프를 사용하거나 정규식을 사용하여 이러한 종류의 작업을 수행하는 것입니다.


공백이 두 칸보다 긴 경우 여러 공백을 올바르게 변환하지 않습니다.
mikeybeck

1

Sandip의 답변을 확장하기 위해 비트에 잘못 코딩 된 문자열이 로그에 표시되었습니다. 그들은 단지 URL을 코딩하려고했지만 공백 뒤에 트위터 핸들과 다른 것들을 넣었습니다. 이렇게 생겼어요

? productID =26%20via%20@LFS

일반적으로, 그것은 문제가되지 않지만 많은 SQL 주입 시도를 받고 있으므로 유효한 ID가 아닌 것은 404로 리디렉션합니다. preg_replace 메소드를 사용하여 잘못된 productID 문자열을 유효한 productID입니다.

$productID=preg_replace('/[\s]+.*/','',$productID);

URL에서 공백을 찾은 다음 그 뒤의 모든 것을 제거합니다.


0

최근에 정규 표현식없이 문자열에서 여분의 공백을 제거하는 간단한 함수를 작성했습니다 implode(' ', array_filter(explode(' ', $str))).


-1
$str = "I      am a PHP   Developer";
$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.