2014-09-18 3 views
3

정규식으로 넘어 가지 않고 ICU로 수행 할 수 있습니까?ICU : 영숫자가 아닌 문자를 모두 자역으로 변환합니다.

protected function normalizeFilename($filename) 
{ 
    $transliterator = Transliterator::createFromRules(
     'Any-Latin; Latin-ASCII; [:Punctuation:] Remove;' 
    ); 
    $filename = $transliterator->transliterate($filename); 
    $filename = preg_replace('/[^A-Za-z0-9_]/', '', $filename); 
    return $filename; 

} 

내가 여기 정규 표현식을 제거 할 수 및 ICU 통화와 모든 것을 할 :

현재 나는이 같은 파일 이름을 정상화?

+0

그냥 50? 이 질문은 마음을 50 번 올렸지? 그것을 200으로 만든다 ..... – UltraDEVV

+0

@UltraDEVV 나는 현상금을 올리는데 의심의 여지가있다. 대답을 알고있는 프로그래머 수를 늘릴 것이다;) –

답변

4

은 작업

난 당신이 지금 무슨 일을하는지 아무것도 잘못 표시되지 않습니다에 대한 올바른 도구를 사용합니다.

ICU 음역은 맨 먼저 언어 지향적입니다. 그것은 의미를 보존하려고 시도합니다.

정규식은 문자를 자세하게 조작 할 수 있으므로 파일 이름이 선택한 문자로 제한된다는 보장을 제공합니다.

이 경우 완벽한 조합입니다.

나는 물론 당신의 질문에 대한 해결책을 찾았습니다. 솔직히 말해서 가능한 모든 입력에 작용할 수있는 것을 찾지 못했습니다.

예를 들어, 모든 문자 (구두점을 고려해야 함)가 [:Punctuation:] Remove;에 의해 제거되지는 않습니다. 러시아 이름 인 Корнильев, Кирилл을 사용해보세요. id을 적용하면 Kornilʹev Kirill이됩니다. 분명히 그것은 구두점이 아니지만 파일 이름에 원하지 않습니다.

그래서 직업에 대한 올바른 도구를 사용하여 조언을 것입니다 :

  1. 사용 ICU를 최고의 ASCII의 enquivalent을 얻을 수 있습니다. id으로 Latin-ASCII; 만 사용하면됩니다. 좋고 간단합니다.
  2. 그런 다음 정규식을 사용하여 필요한 문자 만 남겨 두도록하십시오.

실제로 아무 문제가 없습니다.

추신 : 개인적으로 나는 ICU 사용자 가이드를 작성한 사람이나 사람이 잘된 직업에 대해 칭찬을해서는 안된다고 생각합니다. 이 얼마나 엉망 이죠.

관련 문제