У меня есть регулярное выражение, чтобы получить инициалы имени, как показано ниже:
/\b\p{L}\./gu
он отлично работает с английским и другими языками, пока не появятся графемы и не появятся комбинированные символы.
подобно
क
на хинди и
ಕ
в каннаде
подбираются
Но,
के
этот на хинди,
ಕೆ
этот в Каннаде не соответствуют этому регулярному выражению.
Я пытаюсь получить инициалы от имени, как J.P.Morgan и т. Д.
Любая помощь будет принята с благодарностью.
Вы должны соответствовать диакритическим знакам после базовых букв, используя \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>
Других решений пока нет …