2011-09-07 2 views
4

이 질문에 대한 많은 변형이 존재하며 몇 가지 발전기를 시도했지만이 규칙과 일치하는 정규식을 찾을 수 없습니다. "345-324-3243 X039"와 같은 전화 번호가 있다고 가정하면 숫자, 문자 x 및 더하기 기호 (국제 번호로 표시) 이외의 모든 것을 제거하고 싶습니다. 나는 그것이 "3453243243X039"에 나오는하려는 대신 내가 "30234-2349"얻을숫자, 문자 x 및 더하기 기호 (Regex, PHP) 이외의 모든 것을 제거하십시오.

$phone = "345-324-3243 X039"; 
preg_replace('[^\d|x|\+]', '', $phone); 

:

여기에 내 현재 작동하지 않는 정규식과 코드입니다.

답변

6

문자 클래스 내에서 리터럴 그대로이므로 대문자 "X"(소문자 "x"와 함께)를 캡처하고 정규식 "/ 따옴표 /"를 사용하십시오 (그렇지 않으면 다음과 같이 처리됩니다. 해피 코딩

$phone = "345-324-3243 X039"; 
$phone = preg_replace('/[^\dxX+]/', '', $phone); 
// $phone is 3453243243X039 

"[따옴표]")와 는 결과를 사용합니다.

1

정규 표현식에서 |을 제거하고 +에서 탈출하십시오.

+1

'+'는 이미 문자 클래스 안에있을 필요는 없지만 이미 이스케이프되었습니다. '| '가 불필요하다는 것은 맞지만이 입력에 대한 결과에는 영향을 주어서는 안됩니다. –

1

결과적으로 남은 숫자가 - 인 경우가 아니라 완전히 다른 숫자가 표시됩니까? 그건 나에게 기이하다. 문자 삭제만으로 30234-2349345-324-3243 X039에서 가져올 수 없습니다. 해당 입력의 0 만 끝 부분 근처에 있습니다. 캐릭터가 거의 섞여서 삭제되는 것과 비슷합니다.

패턴 주위에 정규식 구분 기호가 없다는 것을 알고 있습니다. 나는 그것을 시도해 본 기억이 없기 때문에 그 효과가 무엇인지 알지 못한다. 그러나 그것은 정규 표현식의 유일한 기능적 문제이다. 문자 클래스 안에있는 |은 리터럴 | 자로 해석되지만 게시 한 샘플 입력의 결과에는 영향을 미치지 않습니다. 내가 사용하는 것

코드는 이것이다 :

$phone = preg_replace('/[^\dx+]/i', '', $phone); 

내가 /.../ 구분 기호에 정규식을 포장 한이의 |을 제거 이스케이프 + (문자 클래스 내부에 영향을주지해야한다) 대문자 X를 붙잡을 때 대소 문자를 구별하지 않도록 만들었습니다.

관련 문제