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

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

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

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



답변

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


답변

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

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

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

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

그리고 그게 전부입니다.

작동하는지 확인


답변

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

$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로 인코딩 된 문자열을 사용할 때, 즉 비 라틴, 멀티 바이트 문자열과 문자, 작업을하는 경우, 반드시 것 같다.


답변

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