Jak zdobyć pierwsze słowo zdania w PHP?


Odpowiedzi:


254

Funkcji wybuchania można użyć w następujący sposób:

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

Zróbmy 100, to mi pomoże :)
Shivam Pandya,

41
Używając nowoczesnej składni PHP, możesz po prostu to zrobićexplode(' ',trim($myvalue))[0]
Elly Post

2
1-wierszowy kod dla dowolnej wersji PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

3
@ CédricFrançoys limitparametr powinien wynosić 2, ponieważ musi zawierać ostatni element, który zawiera resztę ciągu; 1 zwróciłby ten sam ciąg. O ile nie powstanie duża tablica, wybrałbym wersję Elliota dla jednej wkładki.
Sdlion

A co, jeśli chcesz drugie słowo, a także z RSS NewYorkTimes - media: kredyt to - <media: credit> Dmitry Kostyukov dla The New York Times </ media: credit>. Chcę tylko Dmitrija Kostiukowa - Jak to zrobić? =)

282

Istnieje funkcja tekstowa ( strtok ), której można użyć do podzielenia łańcucha na mniejsze ciągi ( tokeny ) w oparciu o niektóre separatory. Na potrzeby tego wątku pierwsze słowo (zdefiniowane jako cokolwiek przed pierwszym znakiem spacji) Test me moremożna uzyskać przez tokenizację ciągu znaków spacji.

<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>

Aby uzyskać więcej informacji i przykładów, zobacz stronę podręcznika PHP strtok .


3
Briliiant! Lepsze niż oryginalne rozwiązanie
Alberto Fontana

To powinna być pierwsza odpowiedź. Zwraca tylko pierwsze słowo, tak jak chciał, w bardziej przejrzysty sposób.
Wes,

2
Dobre rozwiązanie, ale w podręczniku php ostrzega: Ta funkcja może zwrócić Boolean FALSE, ale może również zwrócić wartość inną niż Boolean, której wynikiem jest FALSE.
Jay Harris,

1
Używam PHP na co dzień od co najmniej 6 lat i do tej pory nigdy nie słyszałem o tej funkcji
Epoc

2
strtokto dziwna i niebezpieczna funkcja, która utrzymuje stan globalny. Należy odradzać korzystanie z tej funkcji.
Arnold Daniels,

39

Jeśli masz PHP 5.3

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

zwróć uwagę, że if $myvaluejest łańcuchem zawierającym jedno słowo strstr, w tym przypadku nic nie zwraca. Rozwiązaniem mogłoby być dodanie spacji do ciągu testowego:

echo strstr( $myvalue . ' ', ' ', true );

To zawsze zwróci pierwsze słowo ciągu, nawet jeśli łańcuch zawiera tylko jedno słowo

Alternatywą jest coś takiego:

$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );

Lub używając eksploduj, które ma tak wiele odpowiedzi, nie zawracam sobie głowy wskazywaniem, jak to zrobić.


1
+1 za niestosowanie wybuchu lub wyrażenia regularnego (oba nieodpowiednie imho). Inną alternatywą byłoby użycie strstr z str_replace, zastępując część za igłą z strstr niczym.
Gordon

1
Warto zauważyć, że chociaż strstrjest dostępny w PHP, ponieważ 4.3.0nie był wcześniej 5.3.0, kiedy before_needledodano opcjonalny parametr (którego używasz w tym przykładzie). Tylko uwaga, bo byłem zdezorientowany, dlaczego twierdzisz, że ten przykład potrzebuje 5.3.0.
trejder

Zauważ, że jeśli ustawisz myvalue na jedno słowo, strstr nie zwraca w tym przypadku nic! Rozwiązaniem może być zawsze dodanie spacji na końcu testowanego ciągu, aby zawsze wracał z pierwszym słowem, nawet jeśli jest to jedyne słowo w ciągu!
patrick

1
Zakładając, że tylko spacje między słowami są ryzykowne, uwzględniłbym również tabulatory.

nie powinno tak byćecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah



7

Podobna do zaakceptowanej odpowiedzi z jednym krokiem mniej:

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

//$first_word == 'Test'

5

Na wypadek, gdybyś nie był pewien, czy ciąg zaczyna się od słowa ...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test

trim($input)w tym przypadku wystarczyłoby: P
zanderwar

4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

Po prostu użyj eksplodowania, aby pobrać każde słowo z wejścia i wyprowadzić pierwszy element wynikowej tablicy.


4

Używając funkcji split, możesz również pobrać pierwsze słowo z łańcucha.

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>

5
UWAGA - split () jest WYCOFANY z 5.3>
Leo


2
$ input = "Sprawdź mnie więcej";
echo preg_replace ("/ \ s. * $ /", "", $ wejście); // „Test”

2

osobiście strsplit/ explode/ strtoknie obsługuje granic słów, więc aby uzyskać bardziej dokładny podział, użyj wyrażenia regularnego z rozszerzeniem\w

preg_split('/[\s]+/',$string,1);

Spowodowałoby to podzielenie słów z granicami do 1.


RobertPitt -> Byłoby pomocne, gdybyś podał przykład, w którym strtok nie powiódł się z granicą słowa w porównaniu z preg_split.
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;

Pozdrawiam Ciul


To byłaby najlepsza odpowiedź, ponieważ działa również w przypadku „jeden, dwa i trzy” (zaakceptowana odpowiedź to echo „jeden”)
patrick,

1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}

1

Możesz to zrobić za pomocą funkcji ciąg znaków PHP bez konwertowania ciągu na tablicę.

 $string = 'some text here';
 $stringLength= strlen($string);
 echo ucfirst(substr($string,-$stringLength-1, 1));

// wyjście S


Świetne rozwiązanie, aby otrzymać pierwszą literę zapytania MySQL w celu rozpoznania operacji zapytania, takich jak Wybierz, Wstaw lub Aktualizuj
Intacto

0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];

0

Funkcja, która podzieli łańcuch na dwie części, pierwsze słowo i pozostały ciąg.

Wartość zwracana: będzie miała odpowiednio firsti remainingklucz w $returntablicy. pierwsze sprawdzenie strpos( $title," ") !== falsejest obowiązkowe w przypadku, gdy łańcuch ma tylko jedno słowo i nie ma w nim spacji.

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

Ponieważ nie możesz sprawdzić wielkich lub małych liter za pomocą strok, działa to doskonale przy sprawdzaniu pierwszego słowa.

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

0

Twoje pytanie można przeformułować jako „zastąp w ciągu znaków pierwszą spację i wszystko następujące po nim nic”. Można to osiągnąć za pomocą prostego wyrażenia regularnego:

$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));

Dla bezpieczeństwa dodałem opcjonalne wywołanie ltrim (): ta funkcja usuwa spacje na początku łańcucha.


0

Wszystkie odpowiedzi tutaj wykorzystują podejście, zgodnie z którym procesor musi przeszukać cały ciąg, nawet jeśli zostanie znalezione pierwsze słowo! W przypadku dużych strun nie jest to zalecane. To podejście jest optymalne:

function getFirstWord($string) {
    $result = "";
    foreach($string as $char) {
        if($char == " " && strlen($result)) {
            break;
        }
        $result .= $char;
    }
    return $result;
}

0

Jeśli chcesz wiedzieć, jak szybko każdy z tych odpowiednich funkcji jest pobiegłem trochę surowej analizy porównawczej w PHP 7.3 na sześciu najbardziej głosowało odpowiedź tutaj ( strposz substr, explodez current, strstr, explodez trim, str_word_counti strtok) z 1.000.000 powtórzeń każdego porównać ich prędkości.

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

?>

Oto różne wyniki z 2 kolejnych przebiegów:

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

A wyniki po odwróceniu kolejności funkcji:

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

Wniosek Okazuje się, że szybkość między tymi funkcjami jest bardzo różna i nie jest tak spójna między przebiegami testów, jak można by się spodziewać. Zgodnie z tymi szybkimi i brudnymi testami, każda z sześciu wybranych funkcji wykona zadanie w rozsądnym czasie. Występują zakłócenia, w tym inne uruchomione procesy, które kolidują z czasem wykonywania. Więc po prostu użyj dowolnej funkcji, która jest najbardziej praktyczna i czytelna dla Ciebie jako programisty. Aby uzyskać większy obraz programowania, zobacz Donald Knuth's Literate Programming .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.