2012-03-14 7 views
53

Как получить первую букву каждого слова для данной строки?получить первую букву каждого слова

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

Я нашел метод javascript, но не был уверен, как его преобразовать в php.

+1

Вы хотите знать, как получить первую букву вашей строки, как описано в вашем вопросе или как получить первую букву каждого слова в соответствии с вашим примером? Если первое: $ result = $ string [0]. – Anonymous

+1

первая буква каждого слова – Grigor

+0

Вы уверены, что каждое слово разделено одним пробелом? 'What__about__this__sentence?' Или 'What about.This предложение? ' –

ответ

88

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

К пункту: 'preg_match_all ("/[AZ]/", ucwords (strtolower ($ string)), $ matches);' – dmmd

5
$temp = explode(' ', $string); 
$result = ''; 
foreach($temp as $t) 
    $result .= $t[0]; 
2
function acronym($string = '') { 
    $words = explode(' ', $string); 
    if (! $words) { 
     return false; 
    } 
    $result = ''; 
    foreach ($words as $word) $result .= $word[0]; 
    return strtoupper($result); 
} 
0

Попробуйте this-

$strs=explode(" ",$string); 

foreach($strs as $str) 
    echo $str[0]; 
13

Предполагая, что слова все Раскол пробелами, это является подходящим решением:

$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" 
+0

Я думаю, что $ word [0] быстрее, чем substr ($ word, 0,1) так почему вы используете substr ($ word, 0,1)? –

+1

Я просто не очень доверяю строкам как массивы. У меня были некоторые ошибки, появившиеся в прошлом – casraf

+1

Уход, чтобы показать нам, какие ошибки для нашей собственной ссылки? – LeonardChallis

0

Что-то вроде этого следует сделать трюк:

$string = 'Some words in a string'; 
$words = explode(' ', $string); // array of word 
foreach($words as $word){ 
    echo $word[0]; // first letter 
} 
1

Думаю, вам нужно взорваться и присоединиться к ним снова .....

<?php 
$string = "Progress in Veterinary Science"; 
$pieces = explode(" ", $string); 
$str=""; 
foreach($pieces as $piece) 
{ 
    $str.=$piece[0]; 
}  
echo $str; /// it will result into "PiVS" 
?> 
5

Как это

preg_match_all('#(?<=\s|\b)\pL#u', $String, $Result); 
echo '<pre>' . print_r($Result, 1) . '</pre>'; 
+0

Ницца. У меня проблема с первым письмом в моем коде. Какой символ указывает первую букву? '<='? – Narek

+1

+1 для '\ pL'. Не могли бы вы добавить небольшое объяснение? Я предпочитаю научить человека ловить рыбу, а не просто дать ему один ;-) – DaveRandom

+0

@Narek (? <=) Это Positive Lookbehind [эта деталь] (http://www.regular-expressions.info/lookaround.html) – Winston

5

Есть много 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); 
+0

Я не согласен, ваш код массивный по сравнению с методами взрыва. – Dale

+2

@ Дале Хорошо, это говорит нам о вас больше, чем о моем коде. Эстетика - плохой способ оценки кода. Использование 'explode' для решения этой проблемы - это то, что можно было бы назвать наивным решением *. Это похоже на использование алгоритма сортировки пузырьков только потому, что его легко реализовать. –

+0

@MAssiveAmountsOfCode Я не согласен, зачем что-то делать в 13 строках кода, которые могут быть достигнуты в 1 'foreach (explode ('', $ string) как $ word) echo $ word [0];'? Легче понять с первого взгляда, а не время тратить время. – Dale

33

Лучший способ добиться этого - с помощью регулярных выражений.

Позволяет ломать то, что вы хотите логичным способом: вы хотите, чтобы каждый символ из строки находился в начале слова. Лучший способ идентифицировать эти символы - искать те символы, которым предшествует пустое пространство.

Итак, мы начинаем с lookbehind для этого символа пробела, а затем любой символ:

/(?<=\s)./ 

Найдет любой символ, которому предшествует пробел. Но - первый символ в строке - это символ в строке, который вы хотите извлечь. И поскольку это первый символ в строке, ему не может предшествовать пробел. Поэтому мы хотим, чтобы соответствовать что-нибудь предшествует пробел или первый символ в строке, поэтому мы добавим start-of-subject assertion:

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

Теперь мы становимся ближе. Но что, если строка содержит блоки из нескольких пространств? Что, если в нем есть пробел, сопровождаемый символом пунктуации? Мы, вероятно, не хотим соответствовать ни одному из них, в жире мы, вероятно, просто хотим сопоставлять буквы. Мы можем сделать это с помощью character class[a-zA-Z]. И мы можем сделать выражение без учета регистра с использованием imodifier.

Таким образом, мы в конечном итоге с:

/(?<=\s|^)[a-z]/i 

Но как же мы на самом деле использовать это в PHP? Ну мы хотим матча всех вхождения регулярного выражения внутри строки, так что мы используем (вы догадались) preg_match_all():

$string = "Progress in Veterinary Science"; 

$expr = '/(?<=\s|^)[a-z]/i'; 
preg_match_all($expr, $string, $matches); 

Теперь у нас есть все символы, которые мы хотели извлечь. Для построения строки результата вы показываете, нам нужно join them together again:

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

... и мы должны гарантировать, что они all upper-case:

$result = strtoupper($result); 

И это действительно все, что нужно сделать.

See it working

+1

Если вы хотите, вы также можете использовать '(? <= \ B)' вместо '(? <= \ S | ^)', это позволит вам фиксировать начальные буквы слов, разделенные дефисом, полными остановками и т. Д. . (в основном символы «без слова», те, которые не совпадают с \ w или \ W), но также могут в конечном итоге захватить то, что вам не нужно. – Leigh

+0

Ваше решение помогло! Спасибо ! – yathrakaaran

+1

Это определенно должен быть ответ. Чрезвычайно подробный и отлично работает, спасибо! –

0

Для случая, когда вы будете делать это на больших строк (или даже непосредственно из файла) 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'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] для извлечения первого letter.You, вероятно, может видеть, что это более эффективно, так чем разделение всей строки на память (всегда используйте как можно меньше памяти). Вы также можете легко изменить это решение для работы с непрерывным чтением файлов и т. Д.

0

Try This

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'); 
3
$str = 'I am a String!'; 
echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str))); 

// would output IaaS 
1

Используя основу 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' 
+0

Это мое первое решение, размещенное на этом сайте. НТН! –

4

Майкл Берковский «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 закодированных строк.

2

Что-то я приготовил.

/** 
* 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; 
} 
0

Мне нравится Reg Expression над любым другим способом извлечения строки, но если вы не знакомы с Reg Ex услышь является метод с использованием функции explode() PHP:

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

Очевидно, что приведенный выше код будет работать только с именем, содержащим два слова.

1

Если в строке ввода имеется больше пробелов между двумя буквами, попробуйте это.

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

2

Как объяснено другими, классический способ состоит в переборе над каждым словом вашей исходной строки, уменьшить слово его первое письмо, и объединить эти первые буквы вместе.

Это вспомогательный метод, сочетающий различные этапы.

/** 
* @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')

строка 'ПЗС' (длина = 3)

getInitials()

строка '' (длина = 0)

getInitials('Lorem ipsum dolor sic amet')

строка «Лидс» (длина = 5)

Конечно, вы можете добавить фильтры к функции обратного вызова array_reduce(), такие как strtoupper(), если вы предпочитаете только в верхнем регистре инициалы, например.

Смежные вопросы