Как получить первую букву каждого слова для данной строки?
$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
.
Таким образом, мы получаем:
/(?<=\s|^)[az]/i
Но как мы на самом деле используем это в PHP? Ну, мы хотим сопоставить все вхождения регулярного выражения внутри строки, поэтому мы используем (вы уже догадались) preg_match_all()
:
$string = "Progress in Veterinary Science"; $expr = '/(?<=\s|^)[az]/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"
$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>';
Есть много 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 закодированных строк.
$str = 'I am a String!'; echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str))); // would output IaaS
function acronym( $string = '' ) { $words = explode(' ', $string); if ( ! $words ) { return false; } $result = ''; foreach ( $words as $word ) $result .= $word[0]; return strtoupper( $result ); }
Что-то я приготовил.
/** * Return the first letter of each word in uppercase - if it's 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; }
Я думаю, вы должны взорваться и присоединиться к ним снова …..
<?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's 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's try with more spaces for fun . "; echo first_letter($str);
Demo1
Альтернатива того же кода
function first_letter($str) { return implode('', array_map(function($v) { return $v[0]; },array_filter(array_map('trim',explode(' ', $str)))));; } $str=" Let's try with more spaces for fun . "; echo first_letter($str);
Demo2
Как объясняют другие, классический способ состоит в повторении каждого слова вашей начальной строки, сводите слово к его первой букве и объедините эти первые буквы вместе.
Вот вспомогательный метод, объединяющий разные этапы.
/** * @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()
если вы предпочитаете только инициалы с верхним регистром, например.
Попробуй это-
$strs=explode(" ",$string); foreach($strs as $str) echo $str[0];
Что-то вроде этого должно сделать трюк:
$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
) вы можете легко реализовать класс Iterator
PHP, который будет делать именно это. Это будет близко к генератору в python и длинному рассказу, вот код:
/** * 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's 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]
для получения первой буквы. Вероятно, вы можете видеть, что это более эффективное решение, чем разделение всей строки на память (всегда используйте как можно меньше памяти). Вы также можете легко изменить это решение для работы с непрерывным чтением файлов и т. Д.
<?php $arr = explode(" ",$String); foreach($arr as $s) { echo substr($s,0,1); } ?>
во-первых, я взорвую строку пробелами, а затем подстроим первый символ.
Попробуй это
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, то слышите это метод, использующий функцию PHP explode()
PHP:
$string = "David Beckham"; $string_split = explode(" ", $string); $inititals = $string_split[0][0] . $string_split[1][0]; echo $inititals;
Очевидно, что указанный выше код будет работать только с именем, содержащим два слова.