영숫자가 아닌 문자를 제거하는 방법?


349

a-z A-Z 0-9세트에 없거나 공백 이 아닌 문자열에서 모든 문자를 제거해야 합니다.

누구든지 이것을 할 수있는 기능이 있습니까?

답변:


695

당신이 이미하고 싶은 것을 거의 알고있는 것처럼 들리 겠지만 기본적으로 정규식으로 정의했습니다.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1 : regexbuddy는 그에 큰 도움이됩니다.
relipse

2
허용되는 문자로 하이픈을 포함하려는 경우의 예입니다. 이메일 주소를 기반으로 무들 사용자 이름에서 허용되지 않는 문자를 제거해야했기 때문에 이것이 필요했습니다. preg_replace ( "/ [^ a-z0-9 _. @ \-] /", '', $ string);
Evan Donovan

2
따옴표 (큰 따옴표) 대신 정규 표현식 주위의 아포스트로피 (작은 따옴표)와 정확히 동일하게 작동합니까? 예 :preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
우리는 이것에 대한 설명을 원합니다 :). 사람들은 왜 그것이 그렇게되었는지 보러 왔습니다. 정규식 설명도 고려하십시오! 감사합니다
Pratik

1
악센트 부호가있는 문자를 유지하려면 어떻게해야합니까?
wonzbak

169

유니 코드 문자의 경우 다음과 같습니다.

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

안녕하세요 voondo, / ui 일에 무엇이 있습니까? 누구든지 내게 빛을 비출 수 있습니까? 감사합니다.
kebyang

4
설명을 위해 플래그라고합니다. 닫는 구분 기호 뒤에 붙입니다 (이 경우 "/"이지만 "~"또는 "@"또는 시작 및 닫는 구분 기호가 동일한 한 사용하려는 문자가 될 수 있음). 표현의 행동.
Doktor J

1
Btw, \w포함 \d\d이 불필요합니다. 또한 결과 문자열에 밑줄을 남기기 때문에 잘못되었습니다 (또한 포함 \w).
smathy

2
여기에는 여전히 오류가 있습니다. 문자 클래스는 ':]'로 끝나야하므로 올바른 행은 다음과 같습니다. preg_replace ( "/ [^ [: alnum :] [: space :]] / ui", '', $ 문자열);
h00ligan

4
는 IS i플래그는 이후 여기에 정말 필요한 [:alnum:]이미 두 경우 모두를 포함?
billynoah

50

정규식 이 답입니다.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i경우를 구분을 의미합니다.
  • ^ 의미로 시작하지 않습니다.
  • \d 모든 숫자와 일치합니다.
  • a-z사이의 모든 문자와 일치 a하고 z. i매개 변수 때문에 a-z및 을 지정할 필요가 없습니다 A-Z.
  • \d이 공간이기 때문에 공간이 정규식에 사용할 수 있습니다.

3
우리는 이것에 대한 설명을 원합니다 :). 사람들은 왜 그것이 그렇게되었는지 보러 왔습니다. 정규식 설명도 고려하십시오! 모든 사람이 당신이 설명없이 당신이 쓴 것을 알기에 충분히 진보 된 것은 아닙니다. 감사합니다
Pratik

@PratikCJoshi i는 대소 문자를 구분하지 않습니다. ^는 시작하지 않음을 의미합니다. \ d는 모든 숫자와 일치합니다. az는 a와 z 사이의 모든 문자와 일치합니다. i 매개 변수 때문에 az 및 AZ를 지정할 필요가 없습니다. \ d 뒤에 공백이 있으므로이 정규식에서 공백이 허용됩니다.
bart

1
사람들 댓글로 답을 읽지 않습니다 . 답변을 업데이트하십시오!
Pratik

18

여기에 대한 간단한 정규식이 있습니다.

\W|_

필요에 따라 사용됩니다 ( /슬래시 구분 기호 사용).

preg_replace("/\W|_/", '', $string);

정규식이하는 일을 설명하는이 훌륭한 도구로 여기에서 테스트하십시오.

http://www.regexr.com/


1
그래도 /u플래그 가 필요합니다. 그렇지 않으면 ASCII가 아닌 문자도 제거됩니다.
Xeoncross

깔끔한 뿐만 아니라 공간을 일치합니다 이가 원하는 경우, 아마를 사용하여 성능을 두 배로 수있는 문자 클래스 추가 정량 을 위해 하나 이상의 [\W_]+
보블 버블

18

일반적인 AZ 대신 다른 언어를 지원해야하는 경우 다음을 사용할 수 있습니다.

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]정의 부정은 (그것이 문자 일치 하지 의 문자 클래스 정의를)
    • \p{L}: 모든 언어 의 편지 .
    • \p{N}: 모든 스크립트 의 숫자 입니다.
    • : 공백 문자.
  • + 탐욕스럽게 캐릭터 클래스를 1에서 무제한으로 일치시킵니다 .

이렇게하면 AZ뿐만 아니라 다른 언어와 스크립트의 문자와 숫자가 보존됩니다.

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

참고 : 이것은 매우 오래되었지만 여전히 관련이있는 질문입니다. 앞으로 방문자에게 도움이 될만한 보충 정보를 제공 할 것입니다.


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

AZ, az, 0-9가 아닌 모든 항목을 선택하고 삭제합니다.

https://regexr.com/3h1rj 예를 참조 하십시오


1
이 정규식 / [\ W _] + / u는 무엇을 의미합니까?
Ângelo Rigo

\W\w문자 의 반대입니다 A-Za-z0-9_. 따라서 \W다른 문자와 일치 A-Za-z0-9_하고 제거합니다. 는 []A는 문자 집합 경계 . 는 +문자 집합 경계에 중복이지만 일반적으로 1 개 이상의 문자를 의미합니다. u플래그는 같은 문자 코드 255을 넘어 문자를 제거하지 않습니다 의미, 유니 코드 문자 지원을 포함하는 표현을 확장 ª²³µ. 유니 코드 및 ASCII 문자를 사용한 다양한 사용법 3v4l.org/hSVV5의 예 .
fyrye


0

나는 또한 대답을 찾고 있었고 내 의도는 모든 비 알파를 청소하는 것이 었으며 두 개 이상의 공간이 없어야합니다.
그래서,이에 알렉스의 답변을 수정, 이것은 나를 위해 노력하고 preg_replace('/[^a-z|\s+]+/i', ' ', $name)
설정 위의 정규식 sy8ed sirajul7_islamsy ed sirajul islam
설명 : 정규식 확인합니다 NOT 어떤 경우에 A에서 Z까지 를 구분 한 공백보다 더 많은 방법이나, 그것은 하나의로 변환됩니다 우주.


-2

문자열을 문자로 나누고 필터링 할 수 있습니다.

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>

downvote의 이유 : 3v4l.org/fqLVZ 또한 길이가 알려지지 않은 문자열에서 (3 + N) 함수를 preg_replace()호출 하면 단일 및 단순 호출에 비해 실제로 매력적이지 않은 것으로 보입니다 .
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.