получить первую букву каждого слова - PullRequest
69 голосов
/ 14 марта 2012

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

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

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

Ответы [ 22 ]

114 голосов
/ 14 марта 2012

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");
40 голосов
/ 23 апреля 2013

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

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

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

/(?<=\s)./

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

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

Теперь мы приближаемся. Но что, если строка содержит блоки из нескольких пробелов? Что если он содержит пробел, за которым следует знак пунктуации? Мы, вероятно, не хотим совпадать ни с одним из них, в толстом мы, вероятно, просто хотим сопоставить буквы. Мы можем сделать это с помощью класса символов [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);

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

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

16 голосов
/ 23 апреля 2013

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

$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"
7 голосов
/ 25 августа 2014

Michael Berkowski (и другие) ответ, упрощенный до одной строки и корректно работающий с многобайтовыми символами (т.е. создание сокращений / инициалов из нелатинской строки):

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

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

5 голосов
/ 23 апреля 2013

Есть много 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 голосов
/ 23 апреля 2013

Как это

<code>preg_match_all('#(?<=\s|\b)\pL#u', $String, $Result);
echo '<pre>' . print_r($Result, 1) . '
';
5 голосов
/ 14 марта 2012
$temp = explode(' ', $string);
$result = '';
foreach($temp as $t)
    $result .= $t[0];
4 голосов
/ 26 марта 2017

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

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

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

3 голосов
/ 28 мая 2013
$str = 'I am a String!';
echo implode('', array_map(function($v) { return $v[0]; }, explode(' ', $str)));

// would output IaaS
2 голосов
/ 14 марта 2012
function acronym( $string = '' ) {
    $words = explode(' ', $string);
    if ( ! $words ) {
        return false;
    }
    $result = '';
    foreach ( $words as $word ) $result .= $word[0];
    return strtoupper( $result );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...