source

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

factcode 2022. 9. 23. 00:03
반응형

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

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

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

javascript 메서드를 찾았는데 어떻게 php로 변환해야 할지 모르겠어요.

explode() 빈칸에서 적절한 서브스트링 방법을 사용하여 각 단어의 첫 번째 문자에 액세스합니다.

$words = explode(" ", "Community College District");
$acronym = "";

foreach ($words as $w) {
  $acronym .= mb_substr($w, 0, 1);
}

단어를 할 수 있을 될 경우 " "로 하십시오.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");

이를 실현하는 가장 좋은 방법은 정규 표현을 사용하는 것입니다.

원하는 내용을 논리적으로 분류해 보겠습니다.문자열의 모든 문자를 단어의 선두에 붙입니다.이러한 문자를 식별하는 가장 좋은 방법은 공백 앞에 있는 문자를 찾는 것입니다.

먼저 해당 공백 문자의 뒷모습으로 시작하고, 그 다음 임의의 문자의 뒷모습은 다음과 같습니다.

/(?<=\s)./

공백 앞에 있는 문자를 찾습니다.단, 문자열의 첫 번째 문자는 추출할 문자열입니다.문자열의 첫 번째 문자이기 때문에 공백이 있을 수 없습니다.따라서 공백 또는 문자열의 첫 번째 문자 앞에 있는 모든 문자와 일치해야 하므로 제목 시작 어설션을 추가합니다.

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

이제 우리는 가까워지고 있다.그러나 문자열에 여러 개의 공백 블록이 포함되어 있으면 어떻게 됩니까?공백 뒤에 구두점이 있으면 어떻게 합니까?우리는 아마도 이것들 중 어느 것도 일치시키고 싶지 않을 것입니다. 지방에서는 그냥 글자를 일치시키고 싶을 것입니다.' 단어라도' '아무 말이나'로할 수 요.\w이렇게 하지 않고 표현식을 .i 수식어 및 수식자uutf-8을 .

결론은 다음과 같습니다.

/(?<=\s|^)\w/iu

하지만 PHP에서는 어떻게 이것을 사용할 수 있을까요?문자열 내의 모든 정규 표현과 일치시키기 위해 (추측한 대로) 다음과 같이 사용합니다.

$string = "Progress in Veterinary Science";

$expr = '/(?<=\s|^)\w/iu';
preg_match_all($expr, $string, $matches);

이제 우리가 추출하고 싶었던 모든 캐릭터들이 나왔습니다.표시된 결과 문자열을 작성하려면 다시 결합해야 합니다.

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

...모두 대문자로 표시되어야 합니다.

$result = mb_strtoupper($result);

그리고 그게 전부입니다.

기능 확인


여기 약간 압축된 버전이 있습니다. "하이픈, 마침표 등으로 구분된 단어의 첫 글자를 캡처하기 위해 Leigh의 코멘트에서 대체 정규식을 사용합니다." (공백이 아닌)

$str="Foo Bar";
preg_match_all('/(?<=\b)\w/iu',$str,$matches);
$result=mb_strtoupper(implode('',$matches[0]));

모든 단어가 공백으로 분할되어 있다고 가정하면 다음과 같은 해결책이 있습니다.

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

것이 있다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);

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 인코딩된 문자열을 사용하는 경우 필수인 것 같습니다.

다른 사람들이 설명하듯이, 고전적인 방식은 첫 번째 문자열의 각 단어에 대해 반복하고, 단어를 첫 글자로 줄인 다음, 첫 글자를 함께 결합하는 것입니다.

다음은 여러 단계를 조합한 도우미 방법입니다.

/**
 * @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()예를 들어 대문자로 된 이니셜만 선호하는 경우.

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

// would output IaaS

내가 만든 거.

/**
 * 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;
}
function acronym( $string = '' ) {
    $words = explode(' ', $string);
    if ( ! $words ) {
        return false;
    }
    $result = '';
    foreach ( $words as $word ) $result .= $word[0];
    return strtoupper( $result );
}

이 경우 str_word_count 함수를 사용하면 어떨까요?

  1. 각 단어를 배열로 배열하다
  2. 배열을 첫 글자로 줄이다

    $sys = array_sarray(str_word_count("커뮤니티 칼리지 디스트릭트"), functions res, $w){ return $res.$w[0]; };

원래의 문자열이 올바르게 작성되어 있는 경우(트림되어 더블스페이스가 없는 경우), 다음과 같이 합니다.

$name = 'John Doe';
$initials = implode( '', array_map( function ( $part ) { 
    return strtoupper( $part['0'] );
}, explode( ' ', $name ) ) );

기본적으로 문자열을 단어로 분할하여 단어의 첫 글자를 추출하고 대문자로 한 후 다시 붙입니다.

폭발해서 다시 합류해야 할 것 같아...

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

다음은 Prateks 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);

데모 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글자일 경우 이름의 처음 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);
}

이거 드셔보세요

$string  = "Community College District";
echo $result = implode ('',array_map(function ($item) {return strtoupper($item[0]);} , explode(' ', $string)));

이거 드셔보세요.

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

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

코드화를 조금 더 하고 (전제적으로)PHP >= 5.0PHP의 클래스를 간단하게 실장할 수 있습니다.이것은 비단뱀의 제너레이터에 가깝습니다.요컨대, 코드는 다음과 같습니다.

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

?>

먼저 줄을 띄엄띄엄 터트리고 그 다음에 첫 번째 문자를 터트린다.

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 Expression을 좋아합니다만, Reg Ex에 익숙하지 않은 경우 hear를 사용하는 방법입니다.explode()PHP 함수:

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

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

이 답변은 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;
    }
}

이 기능은 @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);

(선택할 수 있는 기술이 많음에도 불구하고) 여기서 제안하는 기술에 조금 실망했습니다.

입력 문자열이 공백으로 구분된 "단어"로만 구성되어 있다고 가정할 때(각 단어의 첫 번째 문자가 실제 문자인지 확인할 필요가 없음), 이 간결하고 멀티바이트 안전한 기술을 사용하여 각 단어에서 첫 번째 문자 뒤의 모든 문자를 잘라내고 구분된 공백도 폐기할 수 있습니다.

코드: (데모)

$string = "Let's observe obviously knowledgeable approaches that target helpful items succinctly";

echo preg_replace('~\S\K\S*\s*~u', '', $string);

출력:

Lookatthis

으로 '글자를 대상으로 하는 에는 '글자'를 사용하면 .\p{Ll} 문자가 아닌 경우\P{Ll}으로)\S ★★★★★★★★★★★★★★★★★」\s . 。\K전체 문자열 일치 재시작 - 실제로 빈 문자열로 대체할 더 많은 문자를 일치시키기 전에 각 단어의 일치하는 첫 번째 문자가 "자유로 설정"됩니다.


에는, 각의 첫 를 「」라고 어프로치를 사용하고 있는 됩니다.preg_match_all('~(?<=\s|\b)\pL~u', ...), 케이스의 해 주세요.

$string = "Let's check some fringe-cases: like @mentions and email@example";
#matches:  ^   ^ ^     ^    ^      ^      ^     ^        ^   ^     ^

이것이 바람직한 결과라고 말할 수는 없지만, 만약 그렇다면, 패턴은 다음과 같이 증류될 수 있습니다.~\b\pL~u경계)라는 단어가 있기 입니다.\b 제로 으로, 이 글자를 망라되어 있습니다.\s일치할 수 있습니다.


페이지에서 첫에 의해 첫 번째 문자에 중 (「」와 같이 을 사용합니다).$word[0] ) 。substr()는 멀티바이트 문자가 발생할 때마다 실패합니다.

언급URL : https://stackoverflow.com/questions/9706429/get-the-first-letter-of-each-word-in-a-string

반응형