정규식에서 공백 일치


229

PHP 정규식에서 공백 문자를 일치시켜야합니다. 누구든지 아이디어가 있습니까?

두 단어 사이의 공간 인 "gavin schulz"와 같은 의미입니다. 문자, 숫자 및 공백 만 허용하도록 정규식을 사용하고 있습니다. 그러나 공간을 찾는 방법을 모르겠습니다. 이것이 내가 지금 가진 것입니다.

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
흠 ... 또한 'a'또는 'b'를 일치시키는 것에 대한 질문은 없습니다 ...;)

답변:


368

공간을 찾고 있다면 그것은 " "(한 공간)입니다.

하나 이상을 찾고 있다면 " *"( 공백과 별표) 또는 " +"(한 공백과 플러스)입니다.

당신이 일반적인 간격, 사용을 찾고 있다면 "[ X]"하거나 "[ X][ X]*"또는 "[ X]+"경우 X물리적 탭 문자 (각각은 모든 예에서 하나의 공간이 앞에있다).

이것들은 내가 본 모든 * 정규식 엔진 에서 작동합니다 (일부는 하나 이상의 "+"특성을 가지고 있지 않습니다 ).

당신이 알고 있다면 더 현대적인 정규식 엔진 중 하나를 사용 "\s"하고 있으며 그 변형이 갈 길입니다. 또한 단어 경계는 줄의 시작과 끝과도 일치한다고 생각합니다. 앞이나 뒤에 공백없이 나타날 수있는 단어를 찾을 때 중요합니다.

PHP의 경우이 페이지 가 도움 될 수 있습니다.

편집에서 유효하지 않은 모든 문자를 제거하려는 것으로 나타납니다. 시작 부분은 다음과 같습니다 (정규식 안의 공백에 유의하십시오).

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

각 단어 사이에 공백이 하나만 있고 시작 또는 끝 부분에 공백이 없도록 속임수를 사용하려면 약간 더 복잡하지만 아마도 다른 질문 일 것입니다.

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

그의 원래 정규 표현식은 ""문자를 대체하려는 것 같습니다. 당신은 공간을 부정하고 있으므로, 그의 공간은 의도 한대로 "삭제"되지 않습니다.
Suroot

인용 : "문자, 숫자 및 공백 만 허용", Gavin의 원래 RE는 잘못되었습니다 (그가 질문을하는 이유입니다). 내 RE는 그 중 하나가 아닌 모든 것을 삭제합니다.
paxdiablo

왜 공간이 중간 대신에 일치 패턴의 끝에 있어야합니까?
warren

1
@ 워렌, 그렇지 않습니다. '여기에 공간'이라는 주석은 공간이 어디로 갔는지 나타내는 것이 아니라, 공간이 있다고 진술하는 것이 었습니다 (독자가 인식하지 못한 경우).
paxdiablo

@Mike, 아니요, 그렇지 않습니다. 여기서 의도 는 세트에 없는 모든 문자를 대체 하는 것입니다 A-Za-z.... 대괄호 안의 캐럿이이를 지시합니다. 캐럿을 대괄호 밖으로 이동하면 문자열의 시작 부분 있는 세트의 문자 일치하는 의미로 변경 됩니다.
paxdiablo


34

정규 표현식에서 공백에 대해 알아야 할 모든 것이 있습니다.

  • [[:blank:]] 공백 또는 탭만
  • [[:space:]] 공백
  • \s 공백 문자
  • \v 수직 공백
  • \h 수평 공백
  • x 공백 무시

5

이 경우 REGEX를 사용하는 것은 과잉 일 것 같습니다. 그냥 공간 문자를 찾기 위해 strpos 하지 않는 이유는 무엇입니까? 또한 정규 표현식의 공백 문자에는 특별한 것이 없으므로 다른 문자를 검색 할 때와 마찬가지로 공백 문자를 검색 할 수 있어야합니다. 즉, 패턴 공백을 비활성화하지 않으면이 경우에는 거의 필요하지 않습니다.


5

Perl에서 스위치는 \s(공백)입니다.


16
이것은 정확하지 않습니다-공백 문자뿐만 아니라 모든 공백을 수집합니다.
J. Taylor

그러나 질문은 Perl이 아닌 PHP로 태그됩니다.
피터 Mortensen

4

문자, 숫자 및 공백 만 허용하도록 정규식을 사용하고 있습니다.

그런 다음 이미 가지고있는 공간을 추가하는 것만 큼 간단합니다.

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(참고, 나는 s|의도하지 않은 것처럼 보이는 것을 제거 했습니까? 확실히 s중복되었습니다. |필요한 경우 복원 할 수 있습니다 )

특별히 원하는 경우 * A * 공간에서와 같이 하나 하나,이보다 더 복잡한 표현을해야합니다, 그리고 논리의 별도의 비 정규식 조각을 고려할 수 있습니다.


3

단어 경계에 \ b를 사용할 수도 있습니다. 이름으로 다음과 같이 사용합니다.

[^\b]+\b[^\b]+(\b|$)

편집 Perl 예제에서 이것을 정규 표현식으로 수정

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

다시 편집 원하는 내용을 기반으로 :

$new_tag = preg_replace("/[\s\t]/","",$tag);

1

WordPress의 블로거처럼 비표준 공백 문자를 사용하는 인스턴스에서 [[: space :]]을 시도하고 있습니다. 작동하는 것 같습니다.


1

단일 공간을 허용하려면 이와 같이 사용하십시오.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.