Можно ли это сделать с помощью 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?
Я не вижу ничего плохого в том, что вы делаете сейчас.
Транслитерация ICU в первую очередь ориентирована на язык. Он пытается сохранить смысл.
Регулярные выражения, с другой стороны, могут детально манипулировать символами, что дает вам гарантию того, что имя файла ограничено выбранными символами.
В этом случае комбинация идеальна.
Я, конечно, искал решение вашего вопроса. Но, честно говоря, я не мог найти то, что сработало бы на всех возможных входах.
Например, не все символы, которые мы бы назвали знаками препинания, удаляются [:Punctuation:] Remove;
, Попробуйте русское имя: Корнильев, Кирилл
, После применения вашего id
это становится: Kornilʹev Kirill
, Понятно, что это не знак пунктуации, но вы не хотите использовать его в имени файла.
Поэтому я бы посоветовал использовать правильный инструмент для работы:
Latin-ASCII;
как id
Сделаю. Красиво и просто.В этом нет ничего плохого.
PS: Лично я думаю, что человек, или люди, которые написали руководство пользователя ICU, не должны хвалиться за хорошо выполненную работу. Что за беспорядок
Других решений пока нет …