Wie bekomme ich das erste Wort eines Satzes in PHP?

155

Ich möchte das erste Wort einer Variablen aus einer Zeichenfolge extrahieren. Nehmen Sie zum Beispiel diese Eingabe:

<?php $myvalue = 'Test me more'; ?>

Die resultierende Ausgabe sollte sein Test, was das erste Wort der Eingabe ist. Wie kann ich das machen?

ali
quelle
Möglicherweise finden Sie s($str)->words()[0]hilfreiche Informationen in dieser eigenständigen Bibliothek .
Caw

Antworten:

252

Sie können die Explosionsfunktion wie folgt verwenden:

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
Codaddict
quelle
Lass es uns 100 machen, es hilft mir :)
Shivam Pandya
40
Mit moderner PHP-Syntax können Sie einfach tunexplode(' ',trim($myvalue))[0]
Elly Post
2
1 list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys
3
@ CédricFrançoys Der limitParameter 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.
Sdlion
Was ist, wenn Sie das zweite Wort sowie von RSS NewYorkTimes wollen - media: credit is - <media: credit> Dmitry Kostyukov für die New York Times </ media: credit>. Ich will nur Dmitry Kostyukov - Wie mache ich das? =)
282

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 moreerhalten 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 .

salathe
quelle
3
Genial! Besser als die ursprüngliche Lösung
Alberto Fontana
Dies sollte die erste Antwort sein. Es gibt nur das erste Wort zurück, wie er es sauberer wollte.
Wes
2
Gute Lösung, aber im PHP-Handbuch warnt es: Diese Funktion kann Boolean FALSE zurückgeben, kann aber auch einen nicht-Boolean-Wert zurückgeben, der als FALSE ausgewertet wird.
Jay Harris
1
Ich benutze PHP seit mindestens 6 Jahren täglich und habe bis jetzt noch nie von dieser Funktion gehört
Epoc
2
strtokist eine seltsame und gefährliche Funktion, die einen globalen Staat hält. Von der Verwendung dieser Funktion sollte abgeraten werden.
Arnold Daniels
39

Wenn Sie PHP 5.3 haben

$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);

Beachten Sie, dass if in diesem Fall $myvalueeine Zeichenfolge mit einem Wort strstrnichts 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.

Yacoby
quelle
1
+1 für die Nichtverwendung von Explode oder Regex (beide imho unangemessen). Eine andere Alternative wäre, strstr mit str_replace zu verwenden und das Teil nach der Nadel von strstr durch nichts zu ersetzen.
Gordon
1
Bemerkenswert ist, dass obwohl strstrin PHP verfügbar, da 4.3.0es 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.
Trejder
Beachten Sie, dass strstr in diesem Fall nichts zurückgibt, wenn Sie myvalue auf ein einzelnes Wort setzen! Eine Lösung könnte darin bestehen, immer ein Leerzeichen am Ende der getesteten Zeichenfolge einzufügen, damit immer das erste Wort zurückkommt, auch wenn dies das einzige Wort in der Zeichenfolge ist!
Patrick
1
Angenommen, nur Leerzeichen zwischen Wörtern sind riskant, würde ich auch Tabulatoren einfügen.
sollte das nicht seinecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah
23

Du könntest es tun

echo current(explode(' ',$myvalue));
AntonioCS
quelle
13

Obwohl es etwas spät ist, hat PHP eine bessere Lösung dafür:

$words=str_word_count($myvalue, 1);
echo $words[0];
Lakshmi Rawat Singhania
quelle
7

Ähnlich wie bei einer akzeptierten Antwort mit einem Schritt weniger:

$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];

//$first_word == 'Test'
Radmacher
quelle
5

Nur für den Fall, dass Sie nicht sicher sind, ob die Zeichenfolge mit einem Wort beginnt ...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
Lupuz
quelle
trim($input)würde in diesem Fall ausreichen: P
zanderwar
4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

Verwenden Sie einfach explode, um jedes Wort der Eingabe abzurufen und das erste Element des resultierenden Arrays auszugeben.

Ulf
quelle
4

Mit der Split-Funktion können Sie auch das erste Wort aus der Zeichenfolge abrufen.

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
rekha_sri
quelle
5
HINWEIS - split () ist von 5.3>
Leo
3

strtokist schneller als extractoder preg_*funktioniert.

HM2K
quelle
2
$ input = "Teste mich mehr";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Prüfung"
markcial
quelle
2

persönlich strsplit/ explode/ strtoknicht 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.

RobertPitt
quelle
RobertPitt -> Es wäre hilfreich, wenn Sie ein Beispiel nennen würden, bei dem strtok mit einer Wortgrenze im Vergleich zu einem preg_split fehlgeschlagen ist.
MarcoZen
1
$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

Ciul
quelle
Dies wäre die beste Antwort, da es auch für "eins, zwei und drei" funktioniert (die akzeptierte Antwort würde "eins" wiedergeben)
Patrick
1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}
RafayAhmed
quelle
1

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.

Afraz Ahmad
quelle
Tolle Lösung, um einen ersten Buchstaben einer MySQL-Abfrage zu erhalten, um Abfragevorgänge wie Auswählen, Einfügen oder Aktualisieren zu erkennen
Intacto
0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
Ghostdog74
quelle
0

Funktion, die die Zeichenfolge in zwei Teile unterteilt, das erste Wort und die verbleibende Zeichenfolge.

Rückgabewert: Das Array wird jeweils eingegeben firstund remainingeingegeben $return. Die erste Überprüfung strpos( $title," ") !== falseist 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;
}
Shahzaib Hayat Khan
quelle
0

$ 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.

Anders Lund
quelle
0

Da Sie nicht mit Strich nach Groß- oder Kleinbuchstaben suchen können, funktioniert dies perfekt, um das erste Wort zu überprüfen.

if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }
Baz
quelle
0

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.

Clément Moulin - SimpleRezo
quelle
0

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;
}
Amir Fo
quelle
0

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 ( strposmit substr, explodemit current, strstr, explodemit trim, str_word_countund 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 .

Improv
quelle