복붙노트

PCRE / PHP에서 일치하는 유니 코드 문자

PHP

PCRE / PHP에서 일치하는 유니 코드 문자

나는 PHP에서 이름에 대해 합리적인 허용 유효성 검사기를 작성하려고하는데, 첫 번째 시도는 다음과 같은 패턴으로 구성된다.

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

이것은 결국 preg_match ()에 대한 호출로 전달됩니다. 제가 말할 수있는 한, 이것은 바닐라 ASCII 알파벳과 함께 작동하지만, or 또는 张과 같이 더 매운 캐릭터에 올라가는 것처럼 보입니다.

패턴 자체에 문제가 있습니까? 아마도 나는 생각보다 \ p {L}이 더 많은 일을 할 것으로 기대하고 있습니까?

또는 입력이 전달되는 방식과 관련이 있습니까? 관련이 있는지 확실하지 않지만 양식 페이지에서 UTF8 인코딩을 지정했는지 확인했습니다.

해결법

  1. ==============================

    1.나는 그 문제가 그것보다 훨씬 간단하다고 생각한다 : u 수정자를 지정하는 것을 잊었다. 유니 코드 문자 속성은 UTF-8 모드에서만 사용할 수 있습니다.

    나는 그 문제가 그것보다 훨씬 간단하다고 생각한다 : u 수정자를 지정하는 것을 잊었다. 유니 코드 문자 속성은 UTF-8 모드에서만 사용할 수 있습니다.

    정규식은 다음과 같아야합니다.

    // unicode letters, apostrophe, hyphen, space
    $namePattern = '/^[-\' \p{L}]+$/u';
    
  2. ==============================

    2.우선, 이중 따옴표 대신에 작은 따옴표를 사용하면 인생을 훨씬 쉽게 할 수 있습니다. 단 하나의 백 슬래시 만 있으면됩니다. 둘째, 결합 표시 \ pM도 포함되어야합니다. 일치하지 않는 문자를 발견하면 유니 코드 코드 포인트를 확인한 다음 http://www.fileformat.info/info/unicode/를 사용하여 위치를 파악할 수 있습니다. http://hsivonen.iki.fi/php-utf8/ UTF-8 속성을 사용하여 디버깅을 할 때 귀중한 도구를 찾았습니다 (검색하려고하기 전에 16 진수로 변환하는 것을 잊지 마십시오. array_map ( 'dechex', utf8ToUnicode $ 텍스트))).

    우선, 이중 따옴표 대신에 작은 따옴표를 사용하면 인생을 훨씬 쉽게 할 수 있습니다. 단 하나의 백 슬래시 만 있으면됩니다. 둘째, 결합 표시 \ pM도 포함되어야합니다. 일치하지 않는 문자를 발견하면 유니 코드 코드 포인트를 확인한 다음 http://www.fileformat.info/info/unicode/를 사용하여 위치를 파악할 수 있습니다. http://hsivonen.iki.fi/php-utf8/ UTF-8 속성을 사용하여 디버깅을 할 때 귀중한 도구를 찾았습니다 (검색하려고하기 전에 16 진수로 변환하는 것을 잊지 마십시오. array_map ( 'dechex', utf8ToUnicode $ 텍스트))).

    예를 들어, Ă는 http://www.fileformat.info/info/unicode/char/0102/index.htm이고 Lu에 있기 때문에 L은 일치해야하며 일치합니다. 다른 문자는 http://www.fileformat.info/info/unicode/char/5f20/index.htm이고 isLetter이고 실제로 나와 일치합니다. 컴파일 된 유니 코드 문자 테이블을 가지고 있습니까?

  3. ==============================

    3.유니 코드 이전 패턴을 새 패턴으로 바꾸려면 다음과 같이 작성해야합니다.

    유니 코드 이전 패턴을 새 패턴으로 바꾸려면 다음과 같이 작성해야합니다.

    $text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
    

    여기에 핵심은 u 수정 자입니다.

    참고 : 서버 PHP 버전은 PHP 4.3.5 이상이어야합니다.

    언급 한대로 php.net | 패턴 수정 자

    고마워요. AgreeOr 누가 그 열쇠를 내게주지? preg_replace arabic

    나는 그것을 시도하고 localhost에서 작동하지만 원격 서버에서 작동하지 않을 때 작동하지 않는다면 php.net은 PHP 4.3.5에서 u 수정자를 사용합니다. , 나는 PHP 버전을 업 그레 이드하고 작동합니다

    이 방법은 아랍어 사용자 (عربي)에게 매우 유용하다는 것을 아는 것이 중요합니다. 왜냐하면 - 내가 생각하기에 - 유니 코드가 아랍어 언어에 가장 적합한 인코딩이고 u 수정자를 사용하지 않으면 대체가 작동하지 않기 때문에 다음 예제를 참조하십시오. 너와 일해야 해.

    $ text = preg_replace ( '/ \ b مرحبا بك \ b / u', 'NEW', $ text);

  4. from https://stackoverflow.com/questions/4983392/matching-unicode-letter-characters-in-pcre-php by cc-by-sa and MIT license