2010-08-23 3 views
2
내 문자열에서 두 개 이상의 흰색 문자를 삭제하려고

:정규식 : 삭제 흰색 문자

$content = preg_replace('/\s+/', " ", $content); //in some cases it doesn't work 

하지만 난

을 쓴
$content = preg_replace('/\s\s+/', " ", $content); //works fine 

누군가가 이유를 설명 할 수?

왜냐하면 /\s+/을 쓸 때 하나 이상의 흰색 문자와 모두 일치해야하기 때문에 왜 작동하지 않는 것입니까?

감사합니다.

+1

이 문제를 재현하는 스 니펫을 보내주십시오. 그렇지 않으면. – polygenelubricants

+0

죄송합니다. 문제가 다른 곳에서 발생했습니다. 데이터베이스에 삽입 할 때 값이 손실됩니다. 아주 아주 이상한 행동, 나는 이유를 발견하고 질문을 업데이 트합니다. – Simon

답변

5

일치시킬 공백 문자의 최소 개수는 얼마입니까?

\s+\s\s*과 같습니다. 하나의 필수 공백 문자 다음에 더 많은 숫자가옵니다. 숫자 더 (이 당신이 원하는 경우, 그것은 \s{2,}로 명확 수 있습니다) 다음 이 개 필수 공백 문자 -

\s\s+\s\s\s*에 해당합니다.

또한 $content = preg_replace('/\s+/', " ", $content);$content의 단일 공백을 하나의 공백으로 대체합니다. 즉, 문자열 에만에 공백이 포함되어 있으면 결과가 변경되지 않습니다.

+0

최소 수는 2이지만'/ \ s + /'구조를 사용하는 잠재적 인 위험은 보이지 않지만 어떤 경우에는 문자열의 일부를 삭제하는 경우가 있습니다. 내가 myslq 데이터베이스 에서이 구조를 사용하고 일부 분야에서 같은 문제를 만났습니다. – Simon

+0

'/ \ s + /'는 언급 한 바와 같이 2 공간 요구 사항을 적용하지 않습니다. –

+0

좋아,하지만 어떻게 다른 단어를 삭제할 수, 어쨌든 이해할 수 없다. – Simon

0

/s +/가끔은 다른 사람이 아닌 이유를 덧붙이고 싶었습니다. 정규식은 매우 욕심이 많으므로 하나 이상의 공백 문자와 일치 시키려고합니다. 일치 할 수 있습니다. 나는 이것이 당신이 해결책을 찾는 데 걸려 넘어 졌다고 생각합니다.

죄송합니다. 아직 의견을 추가 할 수 없거나 Daniel의 답변에이 의견을 추가했을 것입니다.

+1

나는 이것이 반대의 효과가있을 것이라고 생각한다. 욕심 많은 정규 표현식은 가능한 한 많은 공백을 매치하고 단일 공백으로 대체하여 OP가 원했던 것을 성취합니다. _ungreedy_ regexp는 문제의 원인이됩니다. 권리? – LarsH

0

Ungreedy 옵션 (/ U)을 사용하고 있습니까? 그것은 코드에서 그렇게 말하지 않지만, 그렇다면 첫 번째 preg_replace()가 각 단일 공간을 단일 공간 (변경 없음)으로 대체하는 이유를 설명합니다. 이 경우 두 번째 preg_replace()는 각 이중 공간을 단일 공간으로 대체합니다. 네 개의 공백으로 구성된 문자열에서 두 번째 공백을 시도하면 결과가 이중 공백입니다.

0

시도 preg_replace("/([\s]{2,})/", " ", $text)

+0

문자 클래스에'\ s'을 사용하거나 전체 표현식을 그룹에 붙일 필요가 없습니다. '/ \ s {2,} /'는 더 짧고 명확합니다. –

+0

나는 모든 것이 그것의 그룹 또는 다른 어떤 유형의 분리에있을 때 그들이 더 분명하게 보인다고 생각한다. 그러나 그렇습니다. 그들은 동등합니다. – Quamis