Comment obtenir le premier mot d'une phrase en PHP?

156

Je veux extraire le premier mot d'une variable d'une chaîne. Par exemple, prenez cette entrée:

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

La sortie résultante doit être Test, qui est le premier mot de l'entrée. Comment puis-je faire ceci?

Ali
la source
Vous pourriez trouver s($str)->words()[0]utile, comme trouvé dans cette bibliothèque autonome .
caw

Réponses:

254

Vous pouvez utiliser la fonction d' éclatement comme suit:

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
codaddict
la source
Lets make it 100, its help me :)
Shivam Pandya
41
En utilisant la syntaxe PHP moderne, vous pouvez le faireexplode(' ',trim($myvalue))[0]
Elly Post
2
Code 1 ligne pour toute version PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys
3
@ CédricFrançoys le limitparamètre doit être 2 car il doit inclure le dernier élément qui contient le reste de la chaîne; 1 retournerait simplement la même chaîne. À moins qu'un grand tableau ne soit créé, j'irais avec la version Elliot pour une seule ligne.
Sdlion
Que faire si vous voulez le deuxième mot ainsi que de RSS NewYorkTimes - media: credit is - <media: credit> Dmitry Kostyukov pour le New York Times </ media: credit>. Je veux seulement Dmitry Kostyukov - Comment faire ça? =)
282

Il existe une fonction de chaîne ( strtok ) qui peut être utilisée pour diviser une chaîne en chaînes plus petites ( jetons ) en fonction de certains séparateurs. Pour les besoins de ce fil, le premier mot (défini comme tout avant le premier caractère d'espace) de Test me morepeut être obtenu en marquant la chaîne sur le caractère d'espace.

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

Pour plus de détails et d'exemples, consultez la page de manuel PHP strtok .

salathe
la source
3
Brillant! Mieux que la solution originale
Alberto Fontana
Cela devrait être la première réponse. Il ne renvoie que le premier mot comme il le voulait d'une manière plus propre.
Wes
2
Bonne solution mais dans le manuel php, cela avertit: Cette fonction peut renvoyer Boolean FALSE, mais peut aussi renvoyer une valeur non-Boolean qui prend la valeur FALSE.
Jay Harris
1
J'utilise PHP quotidiennement depuis au moins 6 ans et je n'ai jamais entendu parler de cette fonction jusqu'à présent
Epoc
2
strtokest une fonction étrange et dangereuse qui détient un état global. L'utilisation de cette fonction doit être déconseillée.
Arnold Daniels
39

Si vous avez PHP 5.3

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

notez que if $myvalueest une chaîne avec un mot strstrne renvoie rien dans ce cas. Une solution pourrait être d'ajouter un espace à la chaîne de test:

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

Cela renverra toujours le premier mot de la chaîne, même si la chaîne ne contient qu'un seul mot

L'alternative est quelque chose comme:

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

Ou en utilisant exploser, qui a tellement de réponses que je ne prendrai pas la peine de montrer comment le faire.

Yacoby
la source
1
+1 pour ne pas utiliser exploser ou regex (tous deux inappropriés à mon humble avis). Une autre alternative serait d'utiliser strstr avec str_replace, en remplaçant la partie après l'aiguille de strstr par rien.
Gordon
1
Il convient de noter que bien qu'il strstrsoit disponible en PHP car 4.3.0il ne l'était pas avant 5.3.0, lorsque le paramètre facultatif before_needle(que vous utilisez dans cet exemple) a été ajouté. Juste un avis, parce que j'étais confus, pourquoi vous dites que cet exemple a besoin 5.3.0.
trejder
Notez que si vous définissez myvalue sur un seul mot, strstr ne renvoie rien dans ce cas! Une solution pourrait être de toujours ajouter un espace à la fin de la chaîne testée pour qu'elle revienne toujours avec le premier mot, même si c'est le seul mot de la chaîne!
patrick
1
En supposant que seuls les espaces entre les mots sont risqués, j'inclurais également des tabulations.
ça ne devrait pas êtreecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah
23

Vous pourriez faire

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

Même s'il est peu tard, PHP a une meilleure solution pour cela:

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

Similaire à la réponse acceptée avec une étape en moins:

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

//$first_word == 'Test'
fabricant de roues
la source
5

Juste au cas où vous n'êtes pas sûr que la chaîne commence par un mot ...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
Lupuz
la source
trim($input)suffirait dans ce cas: P
zanderwar
4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

Utilisez simplement exploser pour obtenir chaque mot de l'entrée et sortir le premier élément du tableau résultant.

Ulf
la source
4

En utilisant la fonction de fractionnement, vous pouvez également obtenir le premier mot de la chaîne.

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
rekha_sri
la source
5
NOTE - split () est DÉPRECÉ de 5.3>
Leo
3

strtokest plus rapide que extractou preg_*fonctionne.

HM2K
la source
2
$ input = "Testez-moi davantage";
echo preg_replace ("/ \ s. * $ /", "", $ entrée); // "Test"
markcial
la source
2

personnellement strsplit/ explode/ strtokne prend pas en charge les limites de mots, donc pour obtenir un partage plus précis, utilisez une expression régulière avec\w

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

Cela diviserait les mots avec des limites jusqu'à une limite de 1.

RobertPitt
la source
RobertPitt -> Ce serait utile si vous donniez un exemple où strtok a échoué avec une limite de mot par rapport à un 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;

Cordialement, Ciul

Ciul
la source
Ce serait la meilleure réponse, car cela fonctionne également pour "un, deux et trois" (la réponse acceptée ferait écho à "un")
patrick
1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}
RafayAhmed
la source
1

Vous pouvez le faire en utilisant la fonction de chaîne PHP substr sans convertir la chaîne en tableau.

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

//les sorties

Afraz Ahmad
la source
Excellente solution pour recevoir une première lettre de requête MySQL pour reconnaître les opérations de requête telles que Sélectionner, Insérer ou Mettre à jour
Intacto
0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
ghostdog74
la source
0

Fonction qui segmentera la chaîne en deux parties, le premier mot et la chaîne restante.

Valeur de retour: Il aura firstet remainingclé $returnrespectivement tableau. La première vérification strpos( $title," ") !== falseest obligatoire dans le cas où la chaîne ne contient qu'un seul mot et pas d'espace.

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
la source
0

$ first_word = str_word_count (1) [0]

Ne fonctionne pas sur les caractères spéciaux et entraînera un comportement incorrect si des caractères spéciaux sont utilisés. Ce n'est pas compatible UTF-8.

Pour plus d'informations, vérifiez si PHP str_word_count () est sécurisé sur plusieurs octets?

Anders Lund
la source
0

Puisque vous ne pouvez pas vérifier avec le trait pour les majuscules ou les minuscules, cela fonctionne parfaitement pour vérifier le premier mot.

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

Votre question pourrait être reformulée comme "remplacer dans la chaîne le premier espace et tout ce qui suit par rien". Cela peut donc être réalisé avec une simple expression régulière:

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

J'ai ajouté un appel optionnel à ltrim () pour être sûr: cette fonction supprime les espaces au début de la chaîne.

Clément Moulin - SimpleRezo
la source
0

Toutes les réponses ici utilisent une approche selon laquelle le processeur doit rechercher toute la chaîne même si le premier mot est trouvé! Pour les grosses cordes, ce n'est pas recommandé. Cette approche est optimale:

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

Si vous voulez savoir à quelle vitesse chacune de ces fonctions est, j'ai couru une analyse comparative brut en PHP 7.3 sur les six réponses les plus voté ici ( strposavec substr, explodeavec current, strstr, explodeavec trim, str_word_countet strtok) avec 1.000.000 itérations chacun pour comparer leurs vitesses.

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

?>

Voici les différents résultats de 2 exécutions consécutives:

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

Et les résultats après avoir inversé l'ordre des fonctions:

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

Conclusion Il s'avère que la vitesse entre ces fonctions varie considérablement et n'est pas aussi cohérente entre les exécutions de test que vous pourriez vous y attendre. Selon ces tests rapides et sales, n'importe laquelle des six fonctions choisies fera le travail dans un laps de temps raisonnable. Il y a des perturbations, y compris d'autres processus en cours d'exécution qui interfèrent avec les temps d'exécution. Alors utilisez simplement la fonction qui vous convient le mieux en tant que programmeur. Pour une vue d'ensemble de la programmation, voir Literate Programming de Donald Knuth .

Improv
la source