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?

6

Решение

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

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

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

В этом случае комбинация идеальна.

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

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

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

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

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

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

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]