Регулярное выражение для соответствия инициалам имени - 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> 
Другие вопросы по тегам