Como obter a primeira palavra de uma frase em PHP?


Respostas:


254

Você pode usar a função explodir da seguinte maneira:

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

Vamos fazer 100, a sua ajuda me :)
Shivam Pandya

41
Usando moderna sintaxe PHP você pode apenas fazerexplode(' ',trim($myvalue))[0]
Elly pós

2
1 código de linha para qualquer versão do PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys 27/10

3
@ CédricFrançoys, o limitparâmetro deve ser 2, pois deve incluir o último elemento que contém o restante da string; Eu retornaria a mesma string. A menos que uma grande matriz fosse criada, eu usaria a versão Elliot para um liner.
Sdlion

E se você quiser a segunda palavra e também o RSS NewYorkTimes - mídia: crédito é - <mídia: crédito> Dmitry Kostyukov para o The New York Times </ mídia: crédito>. Eu só quero Dmitry Kostyukov - Como faço isso? =)

282

Existe uma função de string ( strtok ) que pode ser usada para dividir uma string em strings menores ( tokens ) com base em alguns separadores. Para os fins deste encadeamento, a primeira palavra (definida como qualquer coisa antes do primeiro caractere de espaço) de Test me morepode ser obtida ao tokenizar a sequência no caractere de espaço.

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

Para mais detalhes e exemplos, consulte a página de manual do strtok PHP .


3
Briliiant! Melhor do que a solução original
Alberto Fontana

Essa deve ser a primeira resposta. Ele apenas retorna a primeira palavra como ele queria de uma maneira mais limpa.
Wes

2
Boa solução, mas no manual do php, ele avisa: Esta função pode retornar Boolean FALSE, mas também pode retornar um valor não Boolean que é avaliado como FALSE.
Jay Harris

1
Eu estou usando PHP em uma base diária por pelo menos 6 anos e eu não nunca ouviu falar sobre esta função até agora
Epoc

2
strtoké uma função estranha e perigosa que detém um estado global. O uso dessa função deve ser desencorajado.
Arnold Daniels

39

Se você tem PHP 5.3

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

observe que if $myvalueé uma string com uma palavra strstrnão retorna nada neste caso. Uma solução poderia ser acrescentar um espaço à cadeia de teste:

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

Isso sempre retornará a primeira palavra da string, mesmo se a string tiver apenas uma palavra

A alternativa é algo como:

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

Ou usando o explodir, que tem tantas respostas, não vou me incomodar em mostrar como fazê-lo.


1
+1 por não usar explosão ou regex (ambos imho inadequado). Outra alternativa seria usar strstr com str_replace, substituindo a parte após a agulha por strstr por nada.
19710 Gordon

1
Vale ressaltar que, embora strstresteja disponível no PHP, uma vez 4.3.0que não estava antes 5.3.0, quando o parâmetro opcional before_needle(que você está usando neste exemplo) foi adicionado. Apenas um aviso, porque fiquei confuso, por que você declara que este exemplo precisa 5.3.0.
Trejder

Observe que se você definir meu valor como uma única palavra, strstr não retornará nada neste caso! Uma solução poderia ser sempre adicionar um espaço no final da sequência testada, para que ela sempre retorne com a primeira palavra, mesmo que seja a única palavra na sequência!
patrick

1
Supondo que apenas espaços entre as palavras sejam arriscados, eu também incluiria guias.

não deveria ser issoecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah

23

Você poderia fazer

echo current(explode(' ',$myvalue));

13

Mesmo que seja um pouco tarde, mas o PHP tem uma solução melhor para isso:

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

7

Semelhante à resposta aceita com menos uma etapa:

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

//$first_word == 'Test'

5

Apenas no caso de você não ter certeza de que a sequência começa com uma palavra ...

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

trim($input)seria suficiente neste caso: P
zanderwar

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

Basta usar explodir para obter todas as palavras da entrada e gerar o primeiro elemento da matriz resultante.


4

Usando a função split, você também pode obter a primeira palavra da string.

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

5
OBSERVAÇÃO: split () é DEPRECADO de 5.3>
Leo


2
$ input = "Teste-me mais";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Teste"

2

pessoalmente strsplit/ explode/ strtoknão suporta limites de palavras, portanto, para obter uma divisão mais precisa, use expressão regular com o\w

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

Isso dividiria as palavras com limites para um limite de 1.


RobertPitt -> Seria útil se você desse um exemplo em que strtok falhou com um limite de palavras em comparação com um 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;

Atenciosamente, Ciul


Esta seria a melhor resposta, uma vez que também trabalha para "um, dois e três" (a resposta aceita ecoaria "um")
patrick

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

1

Você pode fazer isso usando a função de string PHP substr sem convocar a string na matriz.

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

// saída S


Grande solução para receber a primeira letra de consulta MySQL para reconhecer consulta operação como SELECT, INSERT ou atualização
Intacto

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

0

Função que tokenizará a string em duas partes, primeira palavra e string restante.

Valor de retorno: Ele terá firste remainingdigitará a $returnmatriz, respectivamente. a primeira verificação strpos( $title," ") !== falseé obrigatória no caso em que a string tenha apenas uma palavra e não haja espaço nela.

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 você não pode verificar com strok maiúsculas ou minúsculas, isso funciona perfeitamente para verificar a primeira palavra.

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

0

Sua pergunta pode ser reformulada como "substitua na cadeia o primeiro espaço e tudo o que segue por nada". Portanto, isso pode ser alcançado com uma simples expressão regular:

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

Eu adicionei uma chamada opcional para ltrim () para ser seguro: essa função remove espaços no início da string.


0

Todas as respostas aqui estão usando uma abordagem que o processador precisa pesquisar em toda a string, mesmo que a primeira palavra seja encontrada! Para cordas grandes, isso não é recomendado. Essa abordagem é ideal:

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

0

Se você quiser saber o quão rápido cada uma dessas respectivas funções é, eu corri alguns bruto de benchmarking em PHP 7.3 em seis mais votado respostas aqui ( strposcom substr, explodecom current, strstr, explodecom trim, str_word_counte strtok) com 1.000.000 iterações cada para comparar suas 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>';

?>

Aqui estão os resultados variáveis ​​de duas execuções 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

E os resultados depois de inverter a ordem das funções:

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

Conclusão Acontece que a velocidade entre essas funções varia muito e não é tão consistente entre as execuções de teste quanto você poderia esperar. De acordo com esses testes rápidos e sujos, qualquer uma das seis funções escolhidas realizará o trabalho em um período de tempo razoável. Existem perturbações, incluindo outros processos em execução, que estão interferindo nos tempos de execução. Portanto, basta usar qualquer função que faça o sentido mais prático e legível para você como programador. Para uma visão geral da programação, consulte Programação alfabética de Donald Knuth .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.