Существует слишком много вариантов, но это должно захватывать имя и фамилию в строке, которая может иметь или не иметь префикс или суффикс, оканчивающийся точкой:
public function initials() {
preg_match('/(?:\w+\. )?(\w+).*?(\w+)(?: \w+\.)?$/', $this->name, $result);
return strtoupper($result[1][0].$result[2][0]);
}
$result[1]
и $result[2]
- первая и последняя группы захвата, а индекс [0]
каждой из них - первый символ строки.
См. Пример
Это неплохо работает, однако имена с пробелом будут возвращать только вторую часть, например, De Jesus
, вернут только Jesus
. Вы можете добавить известные модификаторы для фамилий, например, de, von, van
и c. но удачи в ловле их всех, тем более что он становится еще длиннее van de, van der, van den
.
Чтобы расширить его для неанглийских префиксов и суффиксов sh, вы, вероятно, захотите определить их и вырезать, поскольку некоторые могут не заканчивается точкой.
$delete = ['array', 'of prefixes', 'and suffixes'];
$name = str_replace($delete, '', $this->name);
//or just beginning ^ and end $
$prefix = ['array', 'of prefixes'];
$suffix = ['array', 'of suffixes'];
$name = preg_replace("/^$prefix|$suffix$/", '', $this->name);