Wie bekomme ich das erste Wort eines Satzes in PHP?


Antworten:


252

Sie können die Explosionsfunktion wie folgt verwenden:

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test

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 .


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.


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


13

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

$words=str_word_count($myvalue, 1);
echo $words[0];

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'

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

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.


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];
?>

5
HINWEIS - split () ist von 5.3>
Leo


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

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


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;
}

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.


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];

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;
}


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)){ .. }

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.


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;
}

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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.