得到每个单词的第一个字母
我如何得到给定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第一个字符。
尝试这个
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;
显然,上面的代码只能用于包含两个单词的名字。