Подтвердить что ты не робот

Получить первую букву каждого слова

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

/(?<=\s)./

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

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

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

Итак, в итоге получим:

/(?<=\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);

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

Посмотрите, как работает

Ответ 3

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

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

Ответ 4

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

Ответ 5

Майкл Берковски (и другие) отвечает, упрощается до одной строки и правильно работает над многобайтовыми символами (т.е. делает аббревиатуру/инициалы из нелатинской строки):

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

Использование mb_substr($word, 0, 1, 'utf-8') вместо $word[0] кажется обязательным, если вы работаете с нелатинскими многобайтовыми строками и символами, то есть при использовании кодированных строк UTF-8.

Ответ 6

$temp = explode(' ', $string);
$result = '';
foreach($temp as $t)
    $result .= $t[0];

Ответ 7

Подобно этому

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

Ответ 8

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

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

/**
 * @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(), если вы предпочитаете только инициалы с верхним регистром.

Ответ 9

$str = 'I am a String!';
echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str)));

// would output IaaS

Ответ 10

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

/**
 * Return the first letter of each word in uppercase - if it 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;
}

Ответ 11

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

Ответ 12

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

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

Ответ 13

Используя основание Prateeks, вот простой пример с объяснениями

//  initialize variables
$string = 'Capitalize Each First Word In A String';
$myCapitalizedString = '';

//  here the code
$strs=explode(" ",$string);    
foreach($strs as $str) {
  $myCapitalizedString .= $str[0]; 
}

//  output
echo $myCapitalizedString;  // prints 'CEFWIAS'

Ответ 14

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

function first_letter($str)
{
    $arr2 = array_filter(array_map('trim',explode(' ', $str)));
    $result='';
    foreach($arr2 as $v)
    {
        $result.=$v[0];
    }
    return $result;
}

$str="    Let   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   try   with    more   spaces       for  fun .   ";

echo first_letter($str);

Demo2

Ответ 15

Здесь функция, которая возвращает вам инициалы имени, и если инициалы состоят только из одной буквы, то она возвращает первые 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);
}

Ответ 16

Попробуйте это

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

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

Ответ 17

<?php $arr = explode(" ",$String);

foreach($arr as $s)
{
   echo substr($s,0,1);
}

?>

во-первых, я взорвую строку пробелами, а затем подстрою сначала char.

http://php.net/substr

http://php.net/explode

Ответ 18

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

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

Ответ 19

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

Ответ 20

Попробуйте это

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

Ответ 21

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

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

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

Ответ 22

Почему бы не использовать для этого функцию str_word_count?

  1. получить каждое слово как строку в массиве
  2. уменьшить этот массив до первой буквы

    $ acronym = array_reduce (   str_word_count ("Район общественного колледжа", 1),   функция ($ res, $ w) {       вернуть $ res. $ Ш [0];   } );

Ответ 23

Этот ответ fooobar.com/info/102518/..., но с поддержкой многобайтовых строк:

if (!function_exists('str_acronym')) {
    function str_acronym(string $str, int $min = -1, string $prefix = null): string
    {
        if (mb_strlen($str) <= $min) {
            return $str;
        };

        $words = explode(' ', $str);

        $acronym = strval($prefix);

        foreach ($words as $word) {
            if ($word = trim($word)) {
                $acronym .= mb_strtoupper(mb_substr($word, 0, 1));
            }
        }

        return $acronym;
    }
}