21 ответов:
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|^)./теперь мы приближаемся. Но что делать, если строка содержит блоки из нескольких пробелов? Что делать, если он содержит пробел, за которым следует знак препинания? Мы, вероятно, не хотим соответствовать ни одному из них, в fat мы, вероятно, просто хотим соответствовать буквам. Мы можем сделать это с помощью класс персонажа
[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);и это действительно все.
предполагая, что все слова разделены пробелами, это подходящее решение:
$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"
Майкл Berkowski'S (и другие) ответ, упрощенный до одной строки и правильно работающий на многобайтовых символах (т. е. делающий аббревиатуру / инициалы из нелатинской строки):
foreach(explode(' ', $words) as $word) $acronym .= mb_substr($word, 0, 1, 'utf-8');используя
mb_substr($word, 0, 1, 'utf-8'), вместо$word[0]кажется обязательным, если вы работаете с нелатинскими, многобайтовыми строками и символами, т. е. при использовании кодированных строк UTF-8.
такой
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);
$str = 'I am a String!'; echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str))); // would output IaaS
вот вспомогательный метод, объединяющий различные шаги.
/** * @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()строка " (длина=0)
getInitials('Lorem ipsum dolor sic amet')строка ' Lidsa '(длина=5)
конечно, вы можете добавить фильтры в функцию обратного вызова
array_reduce(), напримерstrtoupper()если вы предпочитаете только прописные инициалы, например.
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 foundation, вот простой пример с объяснениями
// 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);альтернатива того же кода
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);
вот функция, которая возвращает вам инициалы имени, и если инициалы только 1 буква, то она возвращает первые 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); }
что-то вроде этого должно сделать трюк :
$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) вы можете легко реализовать PHPIteratorкласс, который будет делать именно это. Это будет близко к генератору в 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); } ?>во-первых я взрываю строку пробелами, то я substr первый символ.
Попробуй Такое
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 над любым другим методом извлечения строки, но если вы не знакомы с Reg Ex, то hear-это метод, использующий
explode()функция PHP:$string = "David Beckham"; $string_split = explode(" ", $string); $inititals = $string_split[0][0] . $string_split[1][0]; echo $inititals;очевидно, что приведенный выше код будет работать только на имя, содержащее два слова.
Comments