Antworten:
Sie können die Explosionsfunktion wie folgt verwenden:
$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
explode(' ',trim($myvalue))[0]
list($firstword) = explode(' ', trim($myvalue), 1);
limit
Parameter sollte 2 sein, da er das letzte Element enthalten muss, das den Rest der Zeichenfolge enthält. 1 würde nur die gleiche Zeichenfolge zurückgeben. Wenn kein großes Array erstellt würde, würde ich die Elliot-Version für einen Einzeiler verwenden.
Es gibt eine Zeichenfolgenfunktion ( strtok ), mit der eine Zeichenfolge basierend auf einigen Trennzeichen in kleinere Zeichenfolgen ( Token ) aufgeteilt werden kann. Für die Zwecke dieses Threads kann das erste Wort (definiert als alles vor dem ersten Leerzeichen) von Test me more
erhalten werden, indem die Zeichenfolge auf dem Leerzeichen markiert wird .
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
Weitere Details und Beispiele finden Sie auf der strtok PHP-Handbuchseite .
strtok
ist eine seltsame und gefährliche Funktion, die einen globalen Staat hält. Von der Verwendung dieser Funktion sollte abgeraten werden.
Wenn Sie PHP 5.3 haben
$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);
Beachten Sie, dass if in diesem Fall $myvalue
eine Zeichenfolge mit einem Wort strstr
nichts zurückgibt. Eine Lösung könnte darin bestehen, ein Leerzeichen an die Testzeichenfolge anzuhängen:
echo strstr( $myvalue . ' ', ' ', true );
Dadurch wird immer das erste Wort der Zeichenfolge zurückgegeben, auch wenn die Zeichenfolge nur ein Wort enthält
Die Alternative ist so etwas wie:
$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );
Oder mit explode, das so viele Antworten hat, dass ich nicht darauf hinweisen muss, wie es geht.
strstr
in PHP verfügbar, da 4.3.0
es nicht vorher war 5.3.0
, als der optionale Parameter before_needle
(den Sie in diesem Beispiel verwenden) hinzugefügt wurde. Nur ein Hinweis, weil ich verwirrt war, warum Sie sagen, dass dieses Beispiel benötigt 5.3.0
.
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
Obwohl es etwas spät ist, hat PHP eine bessere Lösung dafür:
$words=str_word_count($myvalue, 1);
echo $words[0];
persönlich strsplit
/ explode
/ strtok
nicht Wortgrenzen unterstützen, so einen accute Split Verwendung regulären Ausdruck zu bekommen mit der\w
preg_split('/[\s]+/',$string,1);
Dies würde Wörter mit Grenzen bis zu einer Grenze von 1 teilen.
$string = ' Test me more ';
preg_match('/\b\w+\b/i', $string, $result); // Test
echo $result;
/* You could use [a-zA-Z]+ instead of \w+ if wanted only alphabetical chars. */
$string = ' Test me more ';
preg_match('/\b[a-zA-Z]+\b/i', $string, $result); // Test
echo $result;
Grüße, Ciul
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
Sie können dies mit der PHP-Zeichenfolgenfunktion substr tun, ohne die Zeichenfolge in ein Array umzuwandeln.
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// Ausgabe S.
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
Funktion, die die Zeichenfolge in zwei Teile unterteilt, das erste Wort und die verbleibende Zeichenfolge.
Rückgabewert: Das Array wird jeweils eingegeben first
und remaining
eingegeben $return
. Die erste Überprüfung strpos( $title," ") !== false
ist obligatorisch, wenn die Zeichenfolge nur ein Wort und kein Leerzeichen enthält.
function getStringFirstWord( $title ){
$return = [];
if( strpos( $title," ") !== false ) {
$firstWord = strstr($title," ",true);
$remainingTitle = substr(strstr($title," "), 1);
if( !empty( $firstWord ) ) {
$return['first'] = $firstWord;
}
if( !empty( $remainingTitle ) ) {
$return['remaining'] = $remainingTitle;
}
}
else {
$return['first'] = $title;
}
return $return;
}
$ first_word = str_word_count (1) [0]
Funktioniert nicht mit Sonderzeichen und führt zu falschem Verhalten, wenn Sonderzeichen verwendet werden. Es ist nicht UTF-8-freundlich.
Für weitere Informationen überprüfen Sie, ob PHP str_word_count () Multibyte sicher ist.
Ihre Frage könnte neu formuliert werden als "Ersetzen Sie in der Zeichenfolge das erste Leerzeichen und alles, was folgt, durch nichts". Dies kann also mit einem einfachen regulären Ausdruck erreicht werden:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
Ich habe ltrim () aus Sicherheitsgründen optional aufgerufen: Diese Funktion entfernt Leerzeichen am Anfang der Zeichenfolge.
Alle Antworten hier verwenden einen Ansatz, bei dem der Prozessor die gesamte Zeichenfolge durchsuchen muss, auch wenn das erste Wort gefunden wird! Für große Saiten wird dies nicht empfohlen. Dieser Ansatz ist optimal:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
Wenn Sie wissen wollen , wie schnell jeder dieser jeweiligen Funktionen ist, lief ich einige grobe in PHP Benchmarking 7,3 auf der sechs meisten Antworten hier gewählt ( strpos
mit substr
, explode
mit current
, strstr
, explode
mit trim
, str_word_count
und strtok
) mit 1.000.000 Iterationen jeweils ihre Geschwindigkeiten zu vergleichen.
<?php
$strTest = 'This is a string to test fetching first word of a string methods.';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
$p = strpos($strTest, ' ');
$p !== false ? $strTest : substr( $strTest, 0, $p );
}
$after = microtime(true);
echo 'strpos/ substr: '.($after-$before)/$i . ' seconds<br>';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
strstr($strTest, ' ', true);
}
$after = microtime(true);
echo 'strstr: '.($after-$before)/$i . ' seconds<br>';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
current(explode(' ',$strTest));
}
$after = microtime(true);
echo 'explode/ current: '.($after-$before)/$i . ' seconds<br>';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
$arr = explode(' ',trim($strTest));
$arr[0];
}
$after = microtime(true);
echo 'explode/ trim: '.($after-$before)/$i . ' seconds<br>';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
str_word_count($strTest, 1);
}
$after = microtime(true);
echo 'str_word_count: '.($after-$before)/$i . ' seconds<br>';
$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
strtok($value, ' ');
}
$after = microtime(true);
echo 'strtok: '.($after-$before)/$i . ' seconds<br>';
?>
Hier sind die unterschiedlichen Ergebnisse von 2 aufeinander folgenden Läufen:
strpos/ substr: 6.0736894607544E-8 seconds
strstr: 5.0434112548828E-8 seconds
explode/ current: 3.5163116455078E-7 seconds
explode/ trim: 3.8683795928955E-7 seconds
str_word_count: 4.6665270328522E-6 seconds
strtok: 4.9849510192871E-7 seconds
strpos/ substr: 5.7171106338501E-8 seconds
strstr: 4.7624826431274E-8 seconds
explode/ current: 3.3753299713135E-7 seconds
explode/ trim: 4.2293286323547E-7 seconds
str_word_count: 3.7025549411774E-6 seconds
strtok: 1.2249300479889E-6 seconds
Und die Ergebnisse nach Umkehrung der Reihenfolge der Funktionen:
strtok: 4.2612719535828E-7 seconds
str_word_count: 4.1899878978729E-6 seconds
explode/ trim: 9.3175292015076E-7 seconds
explode/ current: 7.0811605453491E-7 seconds
strstr: 1.0137891769409E-7 seconds
strpos/ substr: 1.0082197189331E-7 seconds
Schlussfolgerung Es stellt sich heraus, dass die Geschwindigkeit zwischen diesen Funktionen stark variiert und zwischen den Testläufen nicht so konstant ist, wie Sie es vielleicht erwarten. Nach diesen schnellen und schmutzigen Tests erledigt jede der sechs ausgewählten Funktionen die Arbeit in angemessener Zeit. Es gibt Störungen, einschließlich anderer laufender Prozesse, die die Ausführungszeiten beeinträchtigen. Verwenden Sie also einfach die Funktion, die für Sie als Programmierer am praktischsten und lesbarsten ist. Für das größere Programmierbild siehe Donald Knuths Literate Programming .
s($str)->words()[0]
hilfreiche Informationen in dieser eigenständigen Bibliothek .