2010-09-09 10 views
9

erstellen Ich bin auf der Suche nach einer Möglichkeit, dass ich den ersten Buchstaben jedes Wortes aus einem Eingabefeld extrahieren und es in eine Variable platzieren kann.Wie man Akronyme einer Phrase in PHP

Beispiel: Wenn das Eingabefeld "Stack-Overflow Questions Tags Users" ist dann der Ausgang für die Variable sollte so etwas wie "SOQTU"

+0

Wie ist 'Stack-Overflow' zwei Wörter? Es ist nicht durch Leerzeichen getrennt. – shamittomar

+0

Sie müssen zuerst "Wort" definieren. In Bezug darauf, was PHP verstehen kann. Der Rest ist einfach. –

Antwort

9

So etwas wie sein:

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

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

Ich bin mit dem regex \b(\w) das Wort übereinstimmen -char unmittelbar nach der Wortgrenze.

EDIT: Um sicherzustellen, dass alle Ihre Akronym-Zeichen Großbuchstaben sind, können Sie strtoupper wie gezeigt verwenden.

+0

Kann dies geändert werden, um kleinen Text in Großbuchstaben umzuwandeln? – dmschenk

+0

bezieht sich das auf die aktuelle Frage oder eine andere Frage? – codaddict

+0

Das hängt mit Ihrem Code in dieser Frage zusammen. Ihr Code erzeugt einen kleinen Buchstaben, wenn das der erste Buchstabe eines Wortes ist. Ich frage nur, wie ich diese in Großbuchstaben umwandeln würde ... Ich denke, es wäre eine andere Frage. – dmschenk

2

Wenn sie nur durch Leerzeichen getrennt sind und nicht andere Dinge. Dies ist, wie Sie es tun können:

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

reguläre Ausdrücke wie codaddict sagt oben oder str_word_count() mit 1 als zweiten Parameter, die eine Reihe von gefundenen Wörter zurückgibt. Siehe die Beispiele im Handbuch. Dann können Sie den ersten Buchstaben jedes Wortes bekommen, wie Sie möchten, einschließlich substr($word, 0, 1)

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

Die str_word_count() Funktion könnte tun, was Sie suchen:

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

+1 für unterschiedlich, und mit str_word_count. Schade, Sie können nicht '-' als Worttrenner definieren. –

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

Das ist ziemlich cool, es hatte auch einige Vorzüge, an die ich anfangs nicht gedacht hatte, wie zB die Umwandlung von kleinen Texten in Großbuchstaben und die Möglichkeit, die Trennzeichen leicht zu steuern. ','/',', ') etc ... – dmschenk

+0

Und all das, ohne dass du deine ansonsten produktiven Stunden mit regulären Ausdrücken verbringen musst. – GZipp

+0

Diese Zeile oder etwas ähnliches sollte innerhalb der foreach hinzugefügt werden: [I] if ($ word && ctype_alnum ($ word [0])) [/ I] (Der ctipetest könnte mit einem anderen optionalen Argument umschaltbar sein.) Und testen , Bitte. – GZipp

3

Nur um ganz andere :

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

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

echo $acronym; 
+1

interessant, dass es Kappen in demselben Wort aufgreift. das könnte sicherlich nützlich sein. – dmschenk

+0

Das ist ein "Nebeneffekt" der Funktion ucwords() ...macht es nützlich für die Großschreibung doppelter Barrel-Namen –

+0

Vorsicht: Wenn die Phrase nur Großbuchstaben enthält, gibt ilt die ganze Phrase zurück. Sie sollten dies stattdessen tun: '$ acronym = implode ('', array_diff_assoc (str_split (ucwords (strtolower ($ input))), str_split (strtolower ($ input))));' – plancton

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

das gleiche wie codaddict's aber kürzer

+0

+1 Das ist beeindruckend clever. –

+0

es ist schlau, aber braucht eine kleine Erklärung, weil es nicht offensichtlich ist: es sucht nach einem Wort (kann 1 Zeichen nur sein), vor einer Grenze oder einem beliebigen Zeichen. Alle Zeichen der Zeichenkette stimmen mindestens mit dieser zweiten Bedingung überein und werden daher durch den Inhalt der passenden Klammer ersetzt: das heißt in jedem Fall ausgenommen Zeichen, denen eine Grenze vorangeht, die nur durch das Zeichen ersetzt werden und dann Initialen werden die einzigen verbleibenden Zeichen. Wenn Sie Leerzeichen und Trennzeichen wie ersetzen wollen - ersetzen Sie (\ w) durch (\.) Und dann "Jean-Claude Vandamme" geben Sie "JC V" – plancton

+0

gerade erkannt, dass es nicht mit lateinischen Zeichen funktioniert ... " Jean-Claude Vandàmme "wil give" JC Vàm "@ mark-baker 's Lösung funktioniert besser, wenn Sie mit den meisten Zeichensätzen arbeiten – plancton