2015-02-03 7 views
1

나는이 함수가 UTF-8 문자열에서 요소를 제거하기 위해이 함수를 발견했으며 preg_match_all 함수를 사용해야하는 이유와 정확하게 패턴을 사용하는 이유를 알지 못합니다 해야 할 것?preg_match_all 사용 및 regex '/./u'패턴 사용

function strtr_utf8($str) 
{ 
    $keys = array(); 
    $values = array(); 
    preg_match_all('/./u', 'ĘÓĄŚŁŻŹĆŃęóąśłżźćń', $keys); 
    preg_match_all('/./u', 'EOASLZZCNeoaslzzcn', $values); 
    $mapping = array_combine($keys[0], $values[0]); 
    return strtr($str, $mapping); 
} 

답변

3

이것은 문자열을 한 문자 배열로 분해하는 것입니다.
두 개의 문자 배열을 얻은 다음 문자 배열을 key=>value 쌍으로 결합합니다.
strtr에 사용되는 문자 대체 -> 이상한 UTF8 문자는 ASCII 문자로 바뀝니다.

왜 우리가 preg_match_all()으로 폭발 시켰습니까? 정규식을 사용하는 이유는 무엇입니까?

/u 키로 인해 UTF8 문자로 작동합니다. str_split()과 같은 일반적인 PHP 문자열 함수를 사용하는 경우 bytes이 아닌 characters으로 파열되며 UTF8의 멀티 바이트 구조로 인해 엉망이됩니다. 마찬가지로 문자 Å은 UTF8 문자열로 2 바이트를 사용합니다.

기본적으로, 당신이 얻을 것은 :

$mapping = ['Ę' => 'E', 'Ó' => 'Q', 'Ą' => 'A', ... 'ń' => 'n']; 

또한 다음과 같이 멀티 바이트 문자열을 라이브러리 기능을 사용할 수 있습니다 여담으로

str_replace(mb_str_split($from), mb_str_split($to), $str); 
+0

왜 나는 문자열을 폭발시키는 것이 아닌가 궁금 해서요.하지만 UTF-8에서 작동하지 않을지 몰랐습니다. 그리고 왜 앞면에 슬래시가 있습니까? 'u' 키를 인용하는 것입니까? –

+1

전면과 후면의 슬래시는 정규식 형식입니다. 예를 들어''/ 정규 표현식/키 ''에서처럼. PHP 정규식 참조를 참조하십시오. http://php.net/manual/en/regexp.reference.delimiters.php –

+0

고맙습니다. –

1

, 타 가능한 방법을 할 같은 것 :

$input = 'ĘÓĄŚŁŻŹĆŃęóąśłżźćń'; 

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

print_r($result);