¿Cómo obtener la primera palabra de una oración en PHP?


Respuestas:


254

Puede usar la función de explosión de la siguiente manera:

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

Vamos a hacer 100, me ayuda :)
Shivam Pandya

41
Usando la sintaxis moderna de PHP que puedes hacerexplode(' ',trim($myvalue))[0]
Elly Post

2
1 código de línea para cualquier versión de PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

3
@ CédricFrançoys el limitparámetro debe ser 2 ya que debe incluir el último elemento que contiene el resto de la cadena; 1 simplemente devolvería la misma cadena. A menos que se creara una gran matriz, iría con la versión de Elliot para una línea.
Sdlion

¿Qué sucede si desea la segunda palabra, así como también de RSS NewYorkTimes ? Solo quiero a Dmitry Kostyukov. ¿Cómo hago eso? =)

282

Hay una función de cadena ( strtok ) que se puede usar para dividir una cadena en cadenas más pequeñas ( tokens ) en función de algunos separadores. Para los propósitos de este hilo, la primera palabra (definida como cualquier cosa antes del primer carácter de espacio) de Test me morepuede obtenerse tokenizando la cadena en el carácter de espacio.

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

Para obtener más detalles y ejemplos, consulte la página del manual de PHP strtok .


3
Brillante! Mejor que la solución original
Alberto Fontana

Esta debería ser la primera respuesta. Solo devuelve la primera palabra como quería de una manera más limpia.
Wes

2
Buena solución, pero en el manual de php, advierte: Esta función puede devolver Boolean FALSE, pero también puede devolver un valor no booleano que se evalúa como FALSE.
Jay Harris el

1
Estoy usando PHP diariamente durante al menos 6 años y nunca había escuchado sobre esta función hasta ahora
Epoc

2
strtokEs una función extraña y peligrosa que tiene un estado global. El uso de esta función debe ser desaconsejado.
Arnold Daniels

39

Si tienes PHP 5.3

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

Tenga en cuenta que si $myvaluees una cadena con una palabra strstrno devuelve nada en este caso. Una solución podría ser agregar un espacio a la cadena de prueba:

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

Eso siempre devolverá la primera palabra de la cadena, incluso si la cadena tiene solo una palabra

La alternativa es algo como:

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

O usando explotar, que tiene tantas respuestas que lo usaré que no me molestaré en señalar cómo hacerlo.


1
+1 por no utilizar explotar o regex (ambos imho inapropiados). Otra alternativa sería usar strstr con str_replace, reemplazando la parte después de la aguja de strstr con nada.
Gordon

1
Vale la pena señalar que, aunque strstrestá disponible en PHP ya 4.3.0que no estaba antes 5.3.0, cuando before_needlese agregó el parámetro opcional (que está utilizando en este ejemplo). Solo un aviso, porque estaba confundido, por qué afirmas, que este ejemplo necesita 5.3.0.
trejder

Tenga en cuenta que si establece myvalue en una sola palabra, strstr no devuelve nada en este caso. Una solución podría ser agregar siempre un espacio al final de la cadena que se prueba para que siempre vuelva con la primera palabra, ¡incluso si esa es la única palabra en la cadena!
patrick

1
Asumiendo que solo los espacios entre palabras son riesgosos, también incluiría pestañas.

no debería ser esoecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah


13

Aunque es un poco tarde, PHP tiene una mejor solución para esto:

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

7

Similar a la respuesta aceptada con un paso menos:

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

//$first_word == 'Test'

5

En caso de que no esté seguro de que la cadena comienza con una palabra ...

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

trim($input)bastaría en este caso: P
zanderwar

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

Simplemente use explotar para obtener cada palabra de la entrada y la salida del primer elemento de la matriz resultante.


4

Usando la función de división también puede obtener la primera palabra de la cadena.

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

55
NOTA: split () está DEPRECADO desde 5.3>
Leo


2
$ input = "Pruébame más";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Prueba"

2

personalmente strsplit/ explode/ strtokno admite límites de palabras, por lo tanto, para obtener una división más aguda, use la expresión regular con el\w

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

Esto dividiría las palabras con límites hasta un límite de 1.


RobertPitt -> Sería útil dar un ejemplo donde strtok falló con un límite de palabra en comparación con 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;

Saludos, Ciul


Esta sería la mejor respuesta, ya que también funciona para "uno, dos y tres" (la respuesta aceptada haría eco de "uno")
patrick

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

1

Puede hacerlo usando la función de cadena PHP substr sin convertir la cadena en una matriz.

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

// salida S


Gran solución para recibir una primera carta de consulta MySQL para reconocer la operación de consulta como Seleccionar, Insertar o Actualizar
Intacto

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

0

Función que tokenizará la cadena en dos partes, la primera palabra y la cadena restante.

Valor de retorno: Tendrá firsty remainingtecleará la $returnmatriz respectivamente. la primera verificación strpos( $title," ") !== falsees obligatoria en caso de que la cadena tenga solo una palabra y no tenga espacio.

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

Como no puede verificar con strok para mayúsculas o minúsculas, esto funciona perfectamente para verificar la primera palabra.

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

0

Su pregunta podría reformularse como "reemplace en la cadena el primer espacio y todo lo que sigue por nada". Entonces esto se puede lograr con una expresión regular simple:

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

He agregado una llamada opcional a ltrim () para estar seguro: esta función elimina espacios al comienzo de la cadena.


0

¡Todas las respuestas aquí están utilizando un enfoque que el procesador necesita para buscar en toda la cadena, incluso si se encuentra la primera palabra! Para cadenas grandes, esto no se recomienda. Este enfoque es óptimo:

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

0

Si quiere saber qué tan rápido cada una de estas respectivas funciones es, me encontré con algunos crudo evaluación comparativa en PHP 7.3 en los seis más votados respuestas aquí ( strposcon substr, explodecon current, strstr, explodecon trim, str_word_county strtok) con 1.000.000 iteraciones cada uno para comparar sus velocidades.

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

?>

Aquí están los resultados variables de 2 ejecuciones consecutivas:

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

Y los resultados después de invertir el orden de las funciones:

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

Conclusión Resulta que la velocidad entre estas funciones varía ampliamente y no es tan consistente entre las ejecuciones de prueba como cabría esperar. De acuerdo con estas pruebas rápidas y sucias, cualquiera de las seis funciones elegidas realizará el trabajo en un tiempo razonable. Hay perturbaciones que incluyen otros procesos en ejecución que interfieren con los tiempos de ejecución. Así que solo use cualquier función que tenga el sentido más práctico y legible para usted como programador. Para obtener una imagen de programación más amplia, consulte la Programación literaria de Donald Knuth .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.