得到每个单词的第一个字母

我如何得到给定string的每个单词的第一个字母?

$string = "Community College District"; $result = "CCD"; 

我find了JavaScript方法,但不知道如何将其转换为PHP。

在空格上使用explode() ,然后使用[]符号作为数组访问结果string:

 $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"); 

用正则expression式来达到这个目的是最好的方法。

让我们以合乎逻辑的方式打破你想要的:你希望string中的每个字符都在一个单词的开头。 识别这些字符的最好方法是查找那些以空格开头的字符。

所以我们先从这个空格字符的后面开始,然后是任何字符:

 /(?<=\s)./ 

这将find任何空格前面的字符。 但是 – string中的第一个字符是string中的字符是你想要提取的字符。 而且因为它是string中的第一个字符,所以不能在空格之前。 所以我们要匹配任何以空格开头的东西或者string中的第一个字符,所以我们添加一个主题开始的断言 :

 /(?<=\s|^)./ 

现在我们正在接近。 但是如果string包含多个空格块呢? 如果它包含一个空格后跟一个标点符号呢? 我们可能不想匹配其中的任何一个,我们可能只想匹配字母。 我们可以用一个字符类 [a-zA-Z]来做到这一点。 我们可以使用i 修饰符使expression式不区分大小写。

所以我们结束了:

 /(?<=\s|^)[az]/i 

但是,我们如何在PHP中实际使用它? 那么我们希望匹配所有在正则expression式中出现的string,所以我们使用(你猜对了) preg_match_all()

 $string = "Progress in Veterinary Science"; $expr = '/(?<=\s|^)[az]/i'; preg_match_all($expr, $string, $matches); 

现在我们有了我们想要提取的所有angular色。 为了构造你显示的结果string,我们需要再次将它们结合在一起 :

 $result = implode('', $matches[0]); 

…我们需要确保它们都是大写的 :

 $result = strtoupper($result); 

而这就是所有这一切。

看到它工作

假设这些单词全部被空格分开,这是一个合适的解决scheme:

 $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函数是一个更优雅和内存有效的解决scheme:

 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); 

Michael Berkowski的(和其他人)回答,简化为一行,并在多字节字符上正确工作(即从非拉丁string中缩写/缩写):

 foreach(explode(' ', $words) as $word) $acronym .= mb_substr($word, 0, 1, 'utf-8'); 

使用mb_substr($word, 0, 1, 'utf-8') ,而不是$word[0]似乎是必须的,如果你在处理非拉丁字符,多字节string和字符,即使用UTF -8编码的string。

 $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 ); } 

我认为你必须爆炸,并再次join他们…..

 <?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' 

如果inputstring中两个字母之间的空格数量更多,请尝试此操作。

 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 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; } 

正如其他人所解释的那样,经典的方法包括遍历初始string的每个单词,将单词缩写为其第一个字母,并将这些第一个字母组合在一起。

这是一个结合不同步骤的辅助方法。

 /** * @return string */ function getInitials($string = null) { return array_reduce( explode(' ', $string), function ($initials, $word) { return sprintf('%s%s', $initials, substr($word, 0, 1)); }, '' ); } 

注意:如果给定的string为空,这将返回一个空string。

getInitials('Community College District')

string“CCD”(长度= 3)

getInitials()

string''(长度= 0)

getInitials('Lorem ipsum dolor sic amet')

string'Lidsa'(长度= 5)

当然,你可以在array_reduce()的callback函数中添加filter,比如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 } 

对于大string(甚至直接从文件)执行此操作的情况, explode()不是执行此操作的最佳方法。 想象一下,如果你不得不将2MB的string分解成大量的内存,那么会浪费多less内存。

只需要更多的代码(假设PHP >= 5.0 ),您可以轻松实现PHP的Iterator类,它将完成这个任务。 这将是接近发电机在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); } } 

如果你将使用一个更具挑战性的string:

 $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]来获取第一个字母。你可能会发现这比将整个string分割成内存更有效(总是尽可能less地使用内存)。 您也可以轻松修改此解决scheme,以连续阅读文件等。

 <?php $arr = explode(" ",$String); foreach($arr as $s) { echo substr($s,0,1); } ?> 

首先我用空格分解string然后我substr第一个字符。

http://php.net/substr

http://php.net/explode

尝试这个

 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的其他任何string提取方法,但是如果您不熟悉Reg Ex,那么hear是一个使用explode() PHP函数的方法:

 $string = "David Beckham"; $string_split = explode(" ", $string); $inititals = $string_split[0][0] . $string_split[1][0]; echo $inititals; 

显然,上面的代码只能用于包含两个单词的名字。