문자열에서 영숫자 문자 만 반환하는 기능?


100

입력 문자열을 가져와 영숫자 만 남기고 모든 특수 문자를 제거하여 위생 화 된 버전을 반환하는 PHP 함수를 찾고 있습니다.

동일한 작업을 수행하지만 알파벳 문자 AZ 만 반환하는 두 번째 함수가 필요합니다.

많은 도움을 주셔서 감사합니다.


어떤 유니 코드 정규화 형식이 있으며, 왜 이렇게 하시겠습니까?
tchrist 2011 년

1
AZ 및 '영숫자'라고 말할 때 실제로 AZ 만 의미합니까 아니면 외국어 및 쓸모없는 스크립트를 포함하여 모든 언어의 모든 문자를 일치시키고 싶습니까?
Mark Byers 2011 년

악센트를 구분하지 않는 문자열 비교를 수행 할 수 있도록이 작업을 수행한다면 잘못된 일을하는 것입니다.
tchrist 2011 년

3
단순히 "모든 언어에서" 가 아닙니다 . 영어입니다. 영어는 라틴 문자를 사용합니다. 있다 unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l라틴어 영문자하지만 AZ 없습니다 == 1192 코드 포인트. 일반적으로 ASCII가 영어로 충분하다는 신화가 있습니다. 그렇지 않습니다. 그래서 AZ를 작성하면 코드 냄새납니다 .
tchrist

1
@Scott B : 영어는 AZ의 26 개 문자 만 사용하는 것이 아닙니다. 예를 들어 이력서라는 단어에는 é가 포함됩니다. 더 나은 답변을 얻는 데 도움이 될 수 있으므로 수행하려는 작업을 설명 할 수 있습니다.
Mark Byers 2011 년

답변:


215

경고 : 영어는 AZ에만 국한되지 않습니다.

az, AZ 및 0-9를 제외한 모든 항목을 제거하려면 다음 을 시도하십시오 .

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

영숫자 정의에 외국어 문자와 쓸모없는 스크립트가 포함 된 경우 유니 코드 문자 클래스를 사용해야합니다.

AZ 만 남겨 두려면 다음 을 시도하십시오 .

$result = preg_replace("/[^A-Z]+/", "", $s);

경고의 이유는 이력서와 같은 단어 é에 이것과 일치하지 않는 문자 가 포함되어 있기 때문입니다. 특정 문자 목록과 일치 시키려면 해당 문자를 포함하도록 정규식을 조정하십시오. 모든 문자를 일치 시키려면 주석에 언급 된 적절한 문자 클래스를 사용하십시오.


2
아니요, 영숫자는 [\p{Alphabetic}\p{Numeric}]입니다. PCRE 알파벳 속성을 잊어 버렸지 만 [\pL\pM\pN].
tchrist 2011 년

1
@tchrist : 나는 그가 AZ를 구체적으로 언급했기 때문에 그가 그것과 일치하기를 원한다고 가정합니다. 나는 설명을 요청할 것입니다.
Mark Byers 2011 년

1
@Mark, 나는 당신의 대답의 두 번째 부분과 논쟁하지 않았습니다.하지만 그가 먼저 문자열을 정식으로 분해하지 않았다면 제대로 작동하지 않을 것입니다. 나는 첫 번째 부분과 논쟁 중이었다. 또한 곰팡이가 많은 오래된 ASCII뿐만 아니라 모든 데이터에서 작동하는 정규식을 항상 올바르게 지정하려고 노력합니다 . :) 따라서 밀레니엄의 이쪽 [A-Z]이 항상 틀렸다는
tchrist 2011 년

1
@Mark Byers, 나는 .. 그리고 네 나는 선호 i하지만 영어 인구 통계에 대해서만 걱정할 필요가 있습니다. .. 많은 사람들이 다른 언어에 대해 생각해야한다는 것을 잊었습니다. BTW 방금 당신이 한 번도 질문을 한 적이없는 최고 응답 사용자라는 것을 알아 챘습니다. 심지어 Jon Skeet도 전에 질문을했습니다!
JD Isaacks 2011 년

1
정규 표현식 끝에 +가있는 이유는 무엇입니까? 제거하면 ... 동일하지 않습니까?
Dennis

2

대신 .NET 과 함께 함수를 사용하여 preg_replace항상 PHP의 필터 함수 를 사용할 수 있습니다 .filter_var()FILTER_SANITIZE_STRING


PHP가 ISO Stringprep 알고리즘에 액세스 할 수 있습니까? Perl과 Java는 알고 있습니다.
tchrist 2011 년

문자열 필터 기능이 주로 7 비트 ASCII에서 작동한다고 생각하지만 그에 대해 인용하지 마십시오.
Mark Baker

30
사용자가 요청한 작업을 명시 적으로 수행하는 방법을 알려주 FILTER_SANITIZE_STRING시겠습니까? 내가 아는 한, 이런 방식으로 보관할 수있는 가장 가까운 것은를 사용하는 FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH것이지만 문자와 숫자뿐만 아니라 점, 슬래시, 퍼센트 등도 남기지 않습니다.
Pere

$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos

4
답변 이라기보다는 댓글처럼 보입니다. 답변을 작성하면서 적절한 설명을하십시오.
Siraj Alam

0
  1. 숫자 [ 0-9 ] 및 일반적인 알파벳 [ \ pL ]에 대해 Santize :
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. 알파벳 A에서 Z (대소 문자 구분 안 함) [ a-zA-Z ]에 대해 특별히 Santize :
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.