2010-09-09 17 views
9

Szukam sposobu, w jaki mogę wyodrębnić pierwszą literę każdego słowa z pola wejściowego i umieścić je w zmiennej.Jak budować akronimy wyrażenia w PHP

Przykład: jeśli pole wejściowe jest "Stack-Overflow Questions Tags Users" następnie wyjście dla zmiennej powinno być coś jak "SOQTU"

+0

Jak jest słowo "Stack-Overflow" dwa słowa? Nie jest oddzielony spacją. – shamittomar

+0

Najpierw musisz zdefiniować "słowo". W terminach, które PHP może zrozumieć. Reszta jest łatwa. –

Odpowiedz

9

Coś jak:

$s = 'Stack-Overflow Questions Tags Users'; 

if(preg_match_all('/\b(\w)/',strtoupper($s),$m)) { 
    $v = implode('',$m[1]); // $v is now SOQTU 
} 

Używam regex \b(\w) dopasować słowo -char natychmiast po granicy słowa.

EDYTOWANIE: Aby zapewnić, że wszystkie znaki akronimu są wielkie, można użyć strtoupper, jak pokazano.

+0

Czy można to zmienić, aby przekonwertować małe litery na wielkie litery? – dmschenk

+0

jest to związane z bieżącym pytaniem lub innym pytaniem? – codaddict

+0

jest to związane z Twoim kodem w tym pytaniu. Twój kod tworzy małą literę, jeśli taka jest pierwsza litera słowa. Po prostu pytam, w jaki sposób zamienić je na wielkie litery ... Myślę, że byłoby to inne pytanie. – dmschenk

2

Jeśli są rozdzielone spacją , a nie innymi rzeczami. W ten sposób można to zrobić:

function acronym($longname) 
{ 
    $letters=array(); 
    $words=explode(' ', $longname); 
    foreach($words as $word) 
    { 
     $word = (substr($word, 0, 1)); 
     array_push($letters, $word); 
    } 
    $shortname = strtoupper(implode($letters)); 
    return $shortname; 
} 
2

dopasowywania wyrażeń regularnych jako codaddict mówi powyżej, lub str_word_count() z 1 jako drugi parametr, która zwraca tablicę znajdując słów. Zobacz przykłady w podręczniku. Następnie można uzyskać pierwszą literę każdego słowa w dowolny sposób, w tym substr($word, 0, 1)

4
$initialism = preg_replace('/\b(\w)\w*\W*/', '\1', $string); 
1

Funkcja str_word_count() może zrobić to, czego szukasz:

$words = str_word_count ('Stack-Overflow Questions Tags Users', 1); 
$result = ""; 
for ($i = 0; $i < count($words); ++$i) 
    $result .= $words[$i][0]; 
+0

+1 za bycie innym i używanie str_word_count. Szkoda, że ​​nie możesz zdefiniować "-" jako separatora słów. –

1
function initialism($str, $as_space = array('-')) 
{ 
    $str = str_replace($as_space, ' ', trim($str)); 
    $ret = ''; 
    foreach (explode(' ', $str) as $word) { 
     $ret .= strtoupper($word[0]); 
    } 
    return $ret; 
} 

$phrase = 'Stack-Overflow Questions IT Tags Users Meta Example'; 
echo initialism($phrase); 
// SOQITTUME 
+0

To jest całkiem fajne, ma też pewne zalety, o których początkowo nie myślałem, jak konwersję małego tekstu na czapki i łatwość kontrolowania używanych znaczników separujących ('- ','/',', ') itp. ... – dmschenk

+0

A wszystko to bez konieczności spędzania w innym miejscu produktywnego czasu na dithering za pomocą wyrażeń regularnych. – GZipp

+0

Ta linia lub coś w tym stylu powinno być dodane wewnątrz foreach: [I] if ($ word && ctype_alnum ($ word [0])) [/ I] (Test cytpe może być przełączany z innym opcjonalnym argumentem.) I test , Proszę. – GZipp

3

Wystarczy być zupełnie inna :

$input = 'Stack-Overflow Questions Tags Users'; 

$acronym = implode('',array_diff_assoc(str_split(ucwords($input)),str_split(strtolower($input)))); 

echo $acronym; 
+1

ciekawe, że podnosi czapki w tym samym słowie. to z pewnością może być przydatne. – dmschenk

+0

To jest "efekt uboczny" funkcji ucwords() ...czyni to użytecznym dla wielkich liter z nazwami podwójnymi. –

+0

Uważaj: jeśli fraza zawiera tylko wielkie litery, ilt zwróci całą frazę. Powinieneś zrobić to zamiast: '$ acronym = implode ('', array_diff_assoc (str_split (ucwords (strtolower (wejście $))), str_split (strtolower (wejście $)));' – plancton

14
$s = 'Stack-Overflow Questions Tags Users'; 
echo preg_replace('~\b(\w)|.~', '$1', $s); 

to samo, co kodaddykt, ale krótszy

+0

+1 To jest imponująco sprytne. –

+0

jest sprytny, ale potrzebuje trochę wyjaśnienia, ponieważ nie jest to oczywiste: wyszukuje słowo (może być tylko 1 znak) poprzedzone granicą LUB dowolną postacią. Wszystkie znaki ciągu pasują do co najmniej tego drugiego warunku, a zatem są zastępowane przez zawartość zgodnego nawiasu: to znaczy w każdym przypadku wyjątkiem są znaki poprzedzone granicą, które są zastępowane przez tylko znak, a następnie inicjały stają się jedyne pozostałe znaki. Jeśli chcesz zachować pustą przestrzeń i separatory, takie jak - zastąp (\ w) przez (\.), A następnie "Jean-Claude Vandamme" poda "JC V" – plancton

+0

, po prostu zdał sobie sprawę, że nie działa ze znakami łacińskimi ... " Jean-Claude Vandàmme "podaruj" JC Vàm "@ mark-baker" rozwiązanie działa lepiej, jeśli pracujesz z większością zestawów znaków – plancton

Powiązane problemy