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?

1 ответ

Решение

Используйте правильный инструмент для работы

Я не вижу ничего плохого в том, что вы делаете сейчас.

Транслитерация ICU в первую очередь ориентирована на язык. Он пытается сохранить смысл.

Регулярные выражения, с другой стороны, могут детально манипулировать символами, что дает вам гарантию того, что имя файла ограничено выбранными символами.

Комбинация идеальна, в этом случае.

Я, конечно, искал решение вашего вопроса. Но, честно говоря, я не мог найти то, что сработало бы на всех возможных входах.

Например, не все символы, которые мы бы назвали знаками препинания, удаляются [:Punctuation:] Remove;, Попробуйте русское имя: Корнильев, Кирилл, После применения вашего id это становится: Kornilʹev Kirill, Понятно, что это не знак пунктуации, но вы не хотите использовать его в имени файла.

Поэтому я бы посоветовал использовать правильный инструмент для работы:

  1. Используйте ICU, чтобы получить лучший эквивалент ASCII. Только используя Latin-ASCII; как id Сделаю. Красиво и просто.
  2. Затем используйте регулярное выражение, как и вы, чтобы убедиться, что у вас остались только те символы, которые вам нужны.

В этом нет ничего плохого.

PS: Лично я думаю, что человек, или люди, которые написали руководство пользователя ICU, не должны хвалиться за хорошо выполненную работу. Что за беспорядок

Другие вопросы по тегам