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



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



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


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

398   21  

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.

$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 функция является гораздо более элегантным и эффективным с точки зрения памяти решением:

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

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

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

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

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

в случае, если вы будете делать это на больших строках (или даже непосредственно из файла) explode() это не лучший способ сделать это. Представьте, сколько памяти будет потрачено впустую, если вам нужно разделить строку размером 2 Мб на память.

С небольшим количеством кодирования и (предполагая 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);
    }
}

и если вы будете использовать его на немного более сложным строку:

$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 первый символ.

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 над любым другим методом извлечения строки, но если вы не знакомы с Reg Ex, то hear-это метод, использующий explode() функция PHP:

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

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

Comments

    Ничего не найдено.