문자열에서 각 단어의 첫 글자를 가져옵니다.


81

주어진 문자열에 대해 각 단어의 첫 글자를 어떻게 얻습니까?

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

나는 자바 스크립트 방법을 찾았지만 그것을 PHP로 변환하는 방법을 모르겠습니다.


1
질문이 어떻게 표현되는지 또는 예에 따라 각 단어의 첫 글자를 얻는 방법에 따라 문자열의 첫 글자를 얻는 방법을 알고 싶습니까? 전자 인 경우 : $ result = $ string [0].
익명

각 단어가 하나의 공백으로 분리되어 있다고 확신하십니까? What__about__this__sentence?또는What about.This sentence?
마이크 B

솔직히 PHP로 자신 만의 스크립트를 개발하세요.
Lion

구분 기호로 사용할 수있는 문자는 무엇입니까? 공백, 대시, 밑줄 등?
Surreal Dreams

1
공백에서 문자열을 분해 한 다음 결과 배열을 반복합니다. 각 문자열이 문자열이기 때문에 $ string [0]을 사용하여 첫 번째 문자를 얻은 다음 간단히 연결할 수 있습니다.
slash197 2013-04-23

답변:


136

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

14
요점 :preg_match_all("/[A-Z]/", ucwords(strtolower($string)), $matches);
dmmd

46

이를 수행하는 가장 좋은 방법은 정규식을 사용하는 것입니다.

원하는 것을 논리적으로 분석 할 수 있습니다. 문자열의 모든 문자가 단어의 시작 부분에 있기를 원합니다. 이러한 문자를 식별하는 가장 좋은 방법은 앞에 공백이있는 문자를 찾는 것입니다.

따라서 해당 공백 문자에 대한 룩 비하인드 로 시작하고 그 뒤에 임의의 문자가 있습니다.

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

그리고 그게 전부입니다.

작동하는지 확인


1
당신은 또한 사용할 수 있습니다 원한다면 (?<=\b)대신에 (?<=\s|^), 이것은 당신이 단어의 첫 글자는 하이픈, 마침표 등으로 구분 캡처 할 것입니다 (기본적으로 "비 단어"문자 또는 \ W \ w에 일치하지 않을 것), 하지만 원하지 않는 것을 캡처하게 될 수도 있습니다.
Leigh

귀하의 솔루션이 많은 도움이되었습니다! 감사합니다 !
yathrakaaran

1
이것은 확실히 답이 될 것입니다. 매우 상세하고 완벽하게 작동합니다. 감사합니다!
Steve Bauman 2016

이것은 도움이되었지만 $ string = "Progress in Veterinary Science (Brower County)"의 경우는 어떻습니까? 'B'가 삭제됩니다. 어떤 생각

17

단어가 모두 공백으로 분리되어 있다고 가정하면 다음과 같은 적절한 솔루션이됩니다.

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

$ word [0]이 substr ($ word, 0,1)보다 빠르다고 생각하는데 왜 substr ($ word, 0,1)을 사용합니까?
Sir l33tname 2013

1
나는 문자열을 배열로 신뢰하지 않습니다. 나는 약간의 오류가 과거에 팝업 했어
casraf

편집 : TL; DR : 단지 오래된 습관
casraf

2
@LeonardChallis Chen Asraf 가 이런 종류의 오류에 대해 언급하고 있는지 모르겠지만 다중 바이트 문자열에서 작업하는 경우 사용 substr($word,0,1)(또는 실제로- mb_substr($word, 0, 1, 'utf-8'))이 절대적으로 필요합니다. simple $word[0]을 사용하면 멀티 바이트 문자의 절반이 잘리고 잘못된 이니셜 (실제 문자 대신 이상한 기호)이 표시됩니다. 이 상황을 오류라고 부르면 답이 있습니다! :]
trejder

어떤 방법 또는 방법 (의에의하는 ...) 같은 단어를 무시하고 대신 "PIVS"의 "PVS"으로 출력을 얻을
Fenil 샤

9

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

동의하지 않습니다. 귀하의 코드는 explode 방법에 비해 방대합니다.
Dale

3
@Dale 글쎄, 그것은 내 코드보다 당신에 대해 더 많이 말해줍니다. 미학은 코드를 평가하는 데 좋지 않은 방법입니다. explode이 문제를 해결하기 위해 사용 하는 것을 순진한 솔루션 이라고합니다 . 구현하기 쉽기 때문에 버블 정렬 알고리즘을 사용하는 것과 같습니다.
Sverri M. 올슨

@MAssiveAmountsOfCode 나는 왜 13 줄의 코드에서 무언가를하는 데 동의하지 않습니다 foreach(explode(' ', $string) as $word) echo $word[0];. 한눈에 이해하기 쉽고 시간 낭비가 아닙니다.
Dale

또한 공백으로 구분 된 단어 문자열을 공백으로 분리하는 것이 순진한 이유는 무엇입니까? 나는 당신의 발언이 당신이 코드 리뷰에 개방적이지 않은 화려한 코더라는 것을 우리에게 알려주는 것이라고 생각합니다.
Dale

3
@Dale 나는 당신을 모욕하거나 화려하게 보일 의도가 없었습니다. 문자열을 분해하면 필요하지 않은 배열이 생성되기 때문에 순진합니다. 문자열을 토큰 화하는 것은 메모리가 덜 필요한 원래 문자열을 단계별로 실행하기 때문에 더 우아합니다. 나는 사용 explode잘못되었다고 말하는 것이 아니라 문제를 해결하는 더 우아한 발언이있다. 그리고 저는 "우아함"이라는 단어를 미학적으로 사용하지 않고 기술적 인 방식으로 사용하고 있습니다.
Sverri M. 올슨

8

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
$temp = explode(' ', $string);
$result = '';
foreach($temp as $t)
    $result .= $t[0];

5

이렇게

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

좋은. 내 코드의 첫 글자에 문제가 있습니다. 첫 글자를 나타내는 문자는 무엇입니까? <=?
Narek

1
에 대한 +1 \pL. 그래도 약간의 설명을 추가해 주시겠습니까? 나는 ;-) 단지 그에게 일을주는 것보다 물고기 사람을 가르치는 것을 선호
DaveRandom

@Narek (<? =)이 포지티브 Lookbehind은 이 세부
윈스톤

@DaveRandom 여기 datail 이 문자에 대한
윈스턴

@Winston 나는 (내가 내 대답에 키스 착수했습니다 있지만) 알고, 내가 :-) 더 OP 의미 ;-)하지만 어쨌든 감사합니다
DaveRandom

5

다른 사람들이 설명했듯이 고전적인 방법은 초기 문자열의 각 단어를 반복하고 단어를 첫 글자로 줄이고 첫 글자를 함께 결합하는 것입니다.

다음은 여러 단계를 결합한 도우미 메서드입니다.

/**
 * @return string
 */
function getInitials($string = null) {
    return array_reduce(
        explode(' ', $string),
        function ($initials, $word) {
            return sprintf('%s%s', $initials, substr($word, 0, 1));
        },
        ''
    );
}

주의 : 주어진 문자열이 비어있는 경우 빈 문자열을 반환합니다.

getInitials('Community College District')

문자열 'CCD'(길이 = 3)

getInitials()

문자열 ''(길이 = 0)

getInitials('Lorem ipsum dolor sic amet')

문자열 'Lidsa'(길이 = 5)

물론 array_reduce()strtoupper()를 들어 대문자 이니셜 만 선호하는 경우 와 같이 의 콜백 함수에 필터를 추가 할 수 있습니다 .


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

// would output IaaS

3

내가 요리 한 것.

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

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

2

str_word_count 함수를 사용하지 않는 이유는 무엇 입니까?

  1. 각 단어를 배열의 행으로 가져옵니다.
  2. 해당 배열을 첫 글자로 입니다.

    $ acronym = array_reduce (str_word_count ( "Community College District", 1), function ($ res, $ w) {return $ res. $ w [0];});


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

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'

이 사이트에 게시 된 첫 번째 솔루션입니다. HTH!
Rob Stocki 2013 년

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

데모 1

동일한 코드의 대안

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

데모 2


1

다음은 이름의 이니셜을 가져 오는 함수입니다. 이니셜이 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);
}


0

이와 같은 것이 트릭을 수행해야합니다.

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

0

큰 문자열 (또는 파일에서 직접) explode()에서이 작업을 수행하는 경우이를 수행하는 가장 좋은 방법이 아닙니다. 2MB 큰 문자열을 메모리로 분할해야하는 경우 얼마나 많은 메모리가 낭비 될지 상상해보십시오.

조금 더 코딩하고 (가정하면 PHP >= 5.0) Iterator정확하게 이것을 수행 하는 PHP의 클래스를 쉽게 구현할 수 있습니다 . 이것은 파이썬의 생성기에 가깝고 짧게 짧게 코드는 다음과 같습니다.

/**
 * 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]첫 글자를 가져 오는 데 쉽게 사용할 수 있습니다. 전체 문자열을 메모리로 분할하는 것보다 더 효과적인 솔루션임을 알 수 있습니다 (항상 가능한 적은 메모리 만 사용). 이 솔루션을 쉽게 수정하여 파일 등을 지속적으로 읽을 수도 있습니다.



0

이 시도

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

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;

분명히 위의 코드는 두 단어가 포함 된 이름에서만 작동합니다.


0

이 답변은 https://stackoverflow.com/a/33080232/1046909 이지만 멀티 바이트 문자열을 지원합니다.

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

0

@Michael Berkowski의 답변을 기반으로 해당 기능을 사용할 수 있습니다.

function buildAcronym($string, $length = 1) {
    $words = explode(" ", $string);
    $acronym = "";
    $length = (self::is_empty($string) || $length <= 0 ? 1 : $length);

    foreach ($words as $i => $w) {
        $i += 1;
        if($i <= $length) {
            $acronym .= $w[0];
        }
    }

    return $acronym;
}

$ length 매개 변수는 표시 할 문자 수를 결정합니다.

용법:

$acronym = buildAcronym("Hello World", 2);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.