2014-10-20 4 views
7

내가 제외한 문자열에서 문자열에서 모든 문자를 제거하기 위해 노력하고있어 :정규 표현식 PHP

  • 영숫자 문자
  • 달러 기호 ($)
  • 밑줄 (_) 코드 포인트 U+0080U+FFFF
사이
  • 유니 코드 문자 나는 네 번째 조건을 일치에 대해 어떻게 가야합니까

    preg_replace('/[^a-zA-Z\d$_]+/', '', $foo); 
    

    :

    나는이 일에 의해 처음 세 가지 조건이 있어요? I looked at using \X이지만 65000 이상의 문자를 나열하는 것보다 더 좋은 방법이 있어야합니다.

  • 답변

    15

    당신은 사용할 수 있습니다

    $foo = preg_replace('/[^\w$\x{0080}-\x{FFFF}]+/u', '', $foo); 
    
    • \w - 정규식에서 유니 코드 지원을위한 코드 포인트 사이의 문자와 일치하는 U 0080 and U + FFFF`
    • /u[a-zA-Z0-9_]
    • \x{0080}-\x{FFFF}의 것과 동일
    +0

    예 일부 exa mples은 OP로부터 더 명확하게 만들 것입니다 – anubhava

    +1

    처음에는'\ w'를 주저했습니다. 왜냐하면 로케일 특정 매칭이 사물에 영향을 줄지 모르겠지만 어쨌든 유니 코드 범위가 악센트 부호가있는 문자를 커버하는 것처럼 보입니다. 그래서 나는 안전하다고 생각합니다. . '/ u'는 제가 찾고있는 것입니다. 고마워요. 참고로 외로운 대리모는 무엇입니까? –

    +1

    @ rink.attendant.6 : 더 많은 문자를 지정할 수 있도록하기 위해 UTF-16에서 서로 게이트를 지정하는'd800'에서'dfff' 범위가 있습니다. 단일 사로 게이트는 UTF-16에서 유효한 문자가 아닙니다 (유효한 문자를 지정하는 데 쌍이 필요합니다). 그래도 PCRE가 문자열에 고독한 대리자를 만났을 때 오류가 발생하면 기억이 안납니다. – nhahtdh