Лучший способ сделать это с помощью регулярных выражений.
Позволяет логически разбить то, что вы хотите: вы хотите, чтобы каждый символ в строке находился в начале слова. Лучший способ идентифицировать эти символы - искать те символы, которым предшествует пробел.
Итак, мы начинаем с lookbehind для этого пробела, за которым следует любой символ:
/(?<=\s)./
Это найдет любой символ, которому предшествует пробел. Но - первый символ в строке - это символ в строке, который вы хотите извлечь. И поскольку это первый символ в строке, ему не может предшествовать пробел. Таким образом, мы хотим сопоставить что-либо с предшествующим пробелом или первым символом в строке, поэтому мы добавляем утверждение начала темы :
/(?<=\s|^)./
Теперь мы приближаемся. Но что, если строка содержит блоки из нескольких пробелов? Что если он содержит пробел, за которым следует знак пунктуации? Мы, вероятно, не хотим совпадать ни с одним из них, в толстом мы, вероятно, просто хотим сопоставить буквы. Мы можем сделать это с помощью класса символов [a-zA-Z]
. И мы можем сделать выражение без учета регистра, используя модификатор i
.
Итак, мы получаем:
/(?<=\s|^)[a-z]/i
Но как мы на самом деле используем это в PHP? Итак, мы хотим сопоставить все вхождения регулярного выражения в строке, поэтому мы используем (как вы уже догадались) preg_match_all()
:
$string = "Progress in Veterinary Science";
$expr = '/(?<=\s|^)[a-z]/i';
preg_match_all($expr, $string, $matches);
Теперь у нас есть все символы, которые мы хотели извлечь. Чтобы построить результирующую строку, которую вы показываете, нам нужно объединить их снова :
$result = implode('', $matches[0]);
... и мы должны убедиться, что они все в верхнем регистре :
$result = strtoupper($result);
И это действительно все, что нужно.
Посмотри, как работает