регулярное выражение для соответствия инициалам имени — PCRE

У меня есть регулярное выражение, чтобы получить инициалы имени, как показано ниже:

/\b\p{L}\./gu

он отлично работает с английским и другими языками, пока не появятся графемы и не появятся комбинированные символы.
подобно
на хинди и
в каннаде

подбираются
Но,
के этот на хинди,
ಕೆ этот в Каннаде
не соответствуют этому регулярному выражению.
Я пытаюсь получить инициалы от имени, как J.P.Morgan и т. Д.
Любая помощь будет принята с благодарностью.

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>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]