주어진 문자열에 대해 각 단어의 첫 글자를 어떻게 얻습니까?
$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>';
