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
, Понятно, что это не знак пунктуации, но вы не хотите использовать его в имени файла.
Поэтому я бы посоветовал использовать правильный инструмент для работы:
- Используйте ICU, чтобы получить лучший эквивалент ASCII. Только используя
Latin-ASCII;
какid
Сделаю. Красиво и просто. - Затем используйте регулярное выражение, как и вы, чтобы убедиться, что у вас остались только те символы, которые вам нужны.
В этом нет ничего плохого.
PS: Лично я думаю, что человек, или люди, которые написали руководство пользователя ICU, не должны хвалиться за хорошо выполненную работу. Что за беспорядок