¿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
codictorio
fuente
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 .

salathe
fuente
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.

Yacoby
fuente
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
23

Podrías hacerlo

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

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

$words=str_word_count($myvalue, 1);
echo $words[0];
Lakshmi Rawat Singhania
fuente
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'
fabricante de ruedas
fuente
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
Lupuz
fuente
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.

Ulf
fuente
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];
?>
rekha_sri
fuente
55
NOTA: split () está DEPRECADO desde 5.3>
Leo
2
$ input = "Pruébame más";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Prueba"
markcial
fuente
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
fuente
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

Ciul
fuente
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;
}
RafayAhmed
fuente
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

Afraz Ahmad
fuente
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];
ghostdog74
fuente
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;
}
Shahzaib Hayat Khan
fuente
0

$ first_word = str_word_count (1) [0]

No funciona en caracteres especiales y dará como resultado un comportamiento incorrecto si se utilizan caracteres especiales. No es compatible con UTF-8.

Para obtener más información, ¿ es seguro PHP str_word_count () multibyte seguro?

Anders Lund
fuente
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)){ .. }
Baz
fuente
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.

Clément Moulin - SimpleRezo
fuente
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;
}
Amir Fo
fuente
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 .

Improvisación
fuente