Регулярное выражение для соответствия инициалам имени - PCRE
У меня есть регулярное выражение, чтобы получить инициалы имени, как показано ниже:
/\b\p{L}\./gu
он отлично работает с английским и другими языками, пока не появятся графемы и не появятся комбинированные символы. подобно क
на хинди и
ಕ
в каннаде подбираются
Но, के
этот на хинди,
ಕೆ
этот в Каннаде не соответствует этому регулярному выражению.
Я пытаюсь получить инициалы от имени, такого как JPMorgan и т. Д.
Любая помощь будет принята с благодарностью.
1 ответ
Решение
Вам необходимо сопоставлять диакритические знаки после базовых букв, используя \p{M}*
:
'~\b(?<!\p{M})\p{L}\p{M}*\.~u'
Шаблон соответствует
\b
- граница слова(?<!\p{M})
- символ перед текущей позицией не должен быть диакритическим символом (без него совпадение может происходить в пределах одного слова)\p{L}
- любая базовая буква Unicode\p{M}*
- 0+ диакритических знаков\.
- точка.
Посмотрите демоверсию PHP онлайн:
$s = "क. ಕ. के. ಕೆ. ";
echo preg_replace('~\b(?<!\p{M})\p{L}\p{M}*+\.~u', '<pre>$0</pre>', $s);
// => <pre>क.</pre> <pre>ಕ.</pre> <pre>के.</pre> <pre>ಕೆ.</pre>