Как получить первую букву каждого слова для данной строки?
$string = "Community College District";
$result = "CCD";
Я нашел javascript-метод, но не был уверен, как его преобразовать в php.
Как получить первую букву каждого слова для данной строки?
$string = "Community College District";
$result = "CCD";
Я нашел javascript-метод, но не был уверен, как его преобразовать в php.
explode()
в пробелах, вы используете нотацию []
для доступа к результирующим строкам в виде массивов:
$words = explode(" ", "Community College District");
$acronym = "";
foreach ($words as $w) {
$acronym .= $w[0];
}
Если у вас есть ожидание, что несколько пробелов могут отделять слова, переключитесь вместо этого на preg_split()
$words = preg_split("/\s+/", "Community College District");
Или, если символы, отличные от пробелов, разграничивают слова (-,_
), например, используйте preg_split()
:
// Delimit by multiple spaces, hyphen, underscore, comma
$words = preg_split("/[\s,_-]+/", "Community College District");
Лучший способ выполнить это с помощью регулярных выражений.
Позволяет разбить то, что вы хотите логичным образом: вы хотите, чтобы каждый символ из строки находился в начале слова. Лучший способ идентифицировать эти символы - искать те символы, которым предшествует пробел.
Итак, мы начинаем с lookbehind для этого символа пробела, за которым следует любой символ:
/(?<=\s)./
Это найдет любой символ, которому предшествует пробел. Но - первый символ в строке - это символ в строке, который вы хотите извлечь. И поскольку это первый символ в строке, ему не может предшествовать пробел. Поэтому мы хотим сопоставить все, что предшествует пробелу или первому символу в строке, поэтому мы добавляем утверждение начала темы:
/(?<=\s|^)./
Теперь мы приближаемся. Но что, если строка содержит блоки из нескольких пространств? Что, если в нем есть пробел, сопровождаемый символом пунктуации? Мы, вероятно, не хотим соответствовать ни одному из них, в жире мы, вероятно, просто хотим сопоставлять буквы. Мы можем сделать это с помощью класса символов [a-zA-Z]
. И мы можем сделать выражение без учета регистра с помощью i
modifier.
Итак, в итоге получим:
/(?<=\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);
И это действительно все, что есть.
Предполагая, что все слова разделены пробелами, это подходящее решение:
$string = "Progress in Veterinary Science";
function initials($str) {
$ret = '';
foreach (explode(' ', $str) as $word)
$ret .= strtoupper($word[0]);
return $ret;
}
echo initials($string); // would output "PIVS"
Есть много ответов explode
. Я думаю, что использование функции strtok
является гораздо более элегантным и экономичным решением:
function createAcronym($string) {
$output = null;
$token = strtok($string, ' ');
while ($token !== false) {
$output .= $token[0];
$token = strtok(' ');
}
return $output;
}
$string = 'Progress in Veterinary Science';
echo createAcronym($string, false);
Вот более надежная и полезная функция, которая поддерживает символы UTF8 и возможность использовать только заглавные слова:
function createAcronym($string, $onlyCapitals = false) {
$output = null;
$token = strtok($string, ' ');
while ($token !== false) {
$character = mb_substr($token, 0, 1);
if ($onlyCapitals and mb_strtoupper($character) !== $character) {
$token = strtok(' ');
continue;
}
$output .= $character;
$token = strtok(' ');
}
return $output;
}
$string = 'Leiðari í Kliniskum Útbúgvingum';
echo createAcronym($string);
Майкл Берковски (и другие) отвечает, упрощается до одной строки и правильно работает над многобайтовыми символами (т.е. делает аббревиатуру/инициалы из нелатинской строки):
foreach(explode(' ', $words) as $word) $acronym .= mb_substr($word, 0, 1, 'utf-8');
Использование mb_substr($word, 0, 1, 'utf-8')
вместо $word[0]
кажется обязательным, если вы работаете с нелатинскими многобайтовыми строками и символами, то есть при использовании кодированных строк UTF-8.
$temp = explode(' ', $string);
$result = '';
foreach($temp as $t)
$result .= $t[0];
Подобно этому
preg_match_all('#(?<=\s|\b)\pL#u', $String, $Result);
echo '<pre>' . print_r($Result, 1) . '</pre>';
Как объясняется другими, классический способ состоит в повторении каждого слова вашей начальной строки, свести слово к его первой букве и объединить эти первые буквы вместе.
Вот вспомогательный метод, объединяющий различные этапы.
/**
* @return string
*/
function getInitials($string = null) {
return array_reduce(
explode(' ', $string),
function ($initials, $word) {
return sprintf('%s%s', $initials, substr($word, 0, 1));
},
''
);
}
NB: это вернет пустую строку, если данная строка пуста.
getInitials('Community College District')
строка 'CCD' (длина = 3)
getInitials()
string '' (length = 0)
getInitials('Lorem ipsum dolor sic amet')
строка 'Lidsa' (длина = 5)
Конечно, вы можете добавлять фильтры к функции обратного вызова array_reduce()
, например strtoupper()
, если вы предпочитаете только инициалы с верхним регистром.
$str = 'I am a String!';
echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str)));
// would output IaaS
Что-то, что я приготовил.
/**
* Return the first letter of each word in uppercase - if it too long.
*
* @param string $str
* @param int $max
* @param string $acronym
* @return string
*/
function str_acronym($str, $max = 12, $acronym = '')
{
if (strlen($str) <= $max) return $str;
$words = explode(' ', $str);
foreach ($words as $word)
{
$acronym .= strtoupper(substr($word, 0, 1));
}
return $acronym;
}
function acronym( $string = '' ) {
$words = explode(' ', $string);
if ( ! $words ) {
return false;
}
$result = '';
foreach ( $words as $word ) $result .= $word[0];
return strtoupper( $result );
}
Я думаю, вам нужно взорваться и снова присоединиться к ним.
<?php
$string = "Progress in Veterinary Science";
$pieces = explode(" ", $string);
$str="";
foreach($pieces as $piece)
{
$str.=$piece[0];
}
echo $str; /// it will result into "PiVS"
?>
Используя основание Prateeks, вот простой пример с объяснениями
// initialize variables
$string = 'Capitalize Each First Word In A String';
$myCapitalizedString = '';
// here the code
$strs=explode(" ",$string);
foreach($strs as $str) {
$myCapitalizedString .= $str[0];
}
// output
echo $myCapitalizedString; // prints 'CEFWIAS'
Если в строке ввода имеется больше пробелов между двумя буквами, попробуйте это.
function first_letter($str)
{
$arr2 = array_filter(array_map('trim',explode(' ', $str)));
$result='';
foreach($arr2 as $v)
{
$result.=$v[0];
}
return $result;
}
$str=" Let try with more spaces for fun . ";
echo first_letter($str);
Альтернатива того же кода
function first_letter($str)
{
return implode('', array_map(function($v) { return $v[0]; },array_filter(array_map('trim',explode(' ', $str)))));;
}
$str=" Let try with more spaces for fun . ";
echo first_letter($str);
Здесь функция, которая возвращает вам инициалы имени, и если инициалы состоят только из одной буквы, то она возвращает первые 2 буквы имени.
function getNameInitials($name) {
preg_match_all('#(?<=\s|\b)\pL#u', $name, $res);
$initials = implode('', $res[0]);
if (strlen($initials) < 2) {
$initials = strtoupper(substr($name, 0, 2));
}
return strtoupper($initials);
}
Попробуйте это
$strs=explode(" ",$string);
foreach($strs as $str)
echo $str[0];
<?php $arr = explode(" ",$String);
foreach($arr as $s)
{
echo substr($s,0,1);
}
?>
во-первых, я взорвую строку пробелами, а затем подстрою сначала char.
Что-то вроде этого должно сделать трюк:
$string = 'Some words in a string';
$words = explode(' ', $string); // array of word
foreach($words as $word){
echo $word[0]; // first letter
}
В случае, если вы будете делать это на больших строках (или даже прямо из файла) explode()
не самый лучший способ сделать это. Представьте, сколько памяти будет потрачено впустую, если вам нужно разделить строку размером 2 МБ в память.
С меньшим количеством кодировок и (при условии PHP >= 5.0
) вы можете легко реализовать класс PHP Iterator
, который будет делать именно это. Это будет близко к генератору в питоне и длинному рассказу, вот код:
/**
* Class for CONTINOUS reading of words from string.
*/
class WordsIterator implements Iterator {
private $pos = 0;
private $str = '';
private $index = 0;
private $current = null;
// Regexp explained:
// ([^\\w]*?) - Eat everything non-word before actual word characters
// Mostly used only if string beings with non-word char
// ([\\w]+) - Word
// ([^\\w]+?|$) - Trailing thrash
private $re = '~([^\\w]*?)([\\w]+)([^\\w]+?|$)~imsS';
// Primary initialize string
public function __construct($str) {
$this->str = $str;
}
// Restart indexing
function rewind() {
$this->pos = 0;
$this->index = 0;
$this->current = null;
}
// Fetches current word
function current() {
return $this->current;
}
// Return id of word you are currently at (you can use offset too)
function key() {
return $this->index;
}
// Here where the magic is done
function next() {
if( $this->pos < 0){
return;
}
$match = array();
++$this->index;
// If we can't find any another piece that matches... Set pos to -1
// and stop function
if( !preg_match( $this->re, $this->str, $match, 0, $this->pos)){
$this->current = null;
$this->pos = -1;
return;
}
// Skip what we have read now
$this->current = $match[2];
$this->pos += strlen( $match[1]) + strlen( $match[2]) + strlen($match[3]);
// We're trying to iterate past string
if( $this->pos >= strlen($this->str)){
$this->pos = -1;
}
}
// Okay, we're done? :)
function valid() {
return ($this->pos > -1);
}
}
И если вы будете использовать его в более сложной строке:
$a = new WordsIterator("Progress in Veterinary Science. And, make it !more! interesting!\nWith new line.");
foreach( $a as $i){
echo $i;
echo "\n";
}
Вы получите ожидаемый результат:
Progress
in
Veterinary
Science
And
make
it
more
interesting
With
new
line
Таким образом, вы можете легко использовать $i[0]
для получения первой буквы. Вероятно, вы можете видеть, что это более эффективное решение, чем разделение всей строки на память (всегда используйте как можно меньше памяти). Вы также можете легко изменить это решение для работы с непрерывным чтением файлов и т.д.
Попробуйте это
function initials($string) {
if(!(empty($string))) {
if(strpos($string, " ")) {
$string = explode(" ", $string);
$count = count($string);
$new_string = '';
for($i = 0; $i < $count; $i++) {
$first_letter = substr(ucwords($string[$i]), 0, 1);
$new_string .= $first_letter;
}
return $new_string;
} else {
$first_letter = substr(ucwords($string), 0, 1);
$string = $first_letter;
return $string;
}
} else {
return "empty string!";
}
}
echo initials('Thomas Edison');
Мне нравится Reg Expression над любым другим методом извлечения строки, но если вы не знакомы с Reg Ex, то слышите метод с использованием функции explode()
PHP:
$string = "David Beckham";
$string_split = explode(" ", $string);
$inititals = $string_split[0][0] . $string_split[1][0];
echo $inititals;
Очевидно, что указанный выше код будет работать только с именем, содержащим два слова.
Почему бы не использовать для этого функцию str_word_count?
уменьшить этот массив до первой буквы
$ acronym = array_reduce ( str_word_count ("Район общественного колледжа", 1), функция ($ res, $ w) { вернуть $ res. $ Ш [0]; } );
Этот ответ fooobar.com/info/102518/..., но с поддержкой многобайтовых строк:
if (!function_exists('str_acronym')) {
function str_acronym(string $str, int $min = -1, string $prefix = null): string
{
if (mb_strlen($str) <= $min) {
return $str;
};
$words = explode(' ', $str);
$acronym = strval($prefix);
foreach ($words as $word) {
if ($word = trim($word)) {
$acronym .= mb_strtoupper(mb_substr($word, 0, 1));
}
}
return $acronym;
}
}