Bagaimana cara mendapatkan kata pertama dari sebuah kalimat di PHP?

156

Saya ingin mengekstrak kata pertama dari sebuah variabel dari sebuah string. Misalnya, ambil input ini:

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

Keluaran yang dihasilkan harus Test, yang merupakan kata pertama dari input. Bagaimana saya bisa melakukan ini?

ali
sumber
Anda mungkin menemukan s($str)->words()[0]bermanfaat, seperti yang ditemukan di perpustakaan mandiri ini .
gak

Jawaban:

254

Anda dapat menggunakan fungsi meledak sebagai berikut:

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
codaddict
sumber
Mari kita buat 100, ini bantu saya :)
Shivam Pandya
41
Menggunakan sintaksis PHP modern yang bisa Anda lakukanexplode(' ',trim($myvalue))[0]
Elly Post
2
1 baris kode untuk versi PHP apa pun:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys
3
@ CédricFrançoys limitparameter harus 2 karena harus menyertakan elemen terakhir yang berisi sisa string; Saya hanya akan mengembalikan string yang sama. Kecuali jika array besar akan dibuat saya akan pergi dengan versi Elliot untuk satu liner.
Sdlion
Bagaimana jika Anda menginginkan kata kedua dan juga dari RSS NewYorkTimes - media: credit is - <media: credit> Dmitry Kostyukov untuk The New York Times </ media: credit>. Saya hanya ingin Dmitry Kostyukov - Bagaimana saya melakukannya? =)
282

Ada fungsi string ( strtok ) yang dapat digunakan untuk membagi string menjadi string yang lebih kecil ( token ) berdasarkan beberapa pemisah. Untuk keperluan utas ini, kata pertama (didefinisikan sebagai apa saja sebelum karakter spasi pertama) Test me moredapat diperoleh dengan tokenizing string pada karakter spasi.

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

Untuk detail dan contoh lebih lanjut, lihat halaman manual PHP strtok .

salathe
sumber
3
Briliiant! Lebih baik daripada solusi aslinya
Alberto Fontana
Ini harus menjadi jawaban pertama. Itu hanya mengembalikan kata pertama seperti yang dia inginkan dengan cara yang lebih bersih.
Wes
2
Solusi yang bagus tetapi dalam manual php, ia memperingatkan: Fungsi ini dapat mengembalikan Boolean FALSE, tetapi juga dapat mengembalikan nilai non-Boolean yang mengevaluasi ke FALSE.
Jay Harris
1
Saya menggunakan PHP setiap hari selama setidaknya 6 tahun dan saya belum pernah mendengar tentang fungsi ini sampai sekarang
Epoc
2
strtokadalah fungsi aneh dan berbahaya yang memegang status global. Menggunakan fungsi ini harus dicegah.
Arnold Daniels
39

Jika Anda memiliki PHP 5.3

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

perhatikan bahwa jika $myvaluestring dengan satu kata strstrtidak mengembalikan apa pun dalam kasus ini. Solusi bisa berupa menambahkan ruang ke string-test:

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

Itu akan selalu mengembalikan kata pertama dari string, bahkan jika string hanya memiliki satu kata di dalamnya

Alternatifnya adalah sesuatu seperti:

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

Atau menggunakan meledak, yang memiliki begitu banyak jawaban menggunakannya saya tidak akan repot-repot menunjukkan bagaimana melakukannya.

Yacoby
sumber
1
+1 karena tidak menggunakan explode atau regex (keduanya imho tidak sesuai). Alternatif lain akan menggunakan strstr dengan str_replace, mengganti bagian setelah jarum dari strstr dengan apa-apa.
Gordon
1
Patut dicatat, bahwa meskipun strstrtersedia dalam PHP karena 4.3.0bukan sebelumnya 5.3.0, ketika parameter opsional before_needle(yang Anda gunakan dalam contoh ini) ditambahkan. Hanya pemberitahuan, karena saya bingung, mengapa Anda menyatakan, bahwa contoh ini perlu 5.3.0.
trejder
Perhatikan bahwa jika Anda menetapkan nilai saya ke strstr kata tunggal tidak mengembalikan apa pun dalam kasus ini! Sebuah solusi bisa jadi selalu menambahkan spasi di akhir string yang diuji sehingga selalu kembali dengan kata pertama, bahkan jika itu adalah satu-satunya kata dalam string!
patrick
1
Dengan asumsi hanya spasi di antara kata-kata yang berisiko, saya juga akan menyertakan tab.
seharusnya tidak menjadiecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah
23

Anda bisa melakukannya

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

Meskipun sedikit terlambat, tetapi PHP memiliki satu solusi yang lebih baik untuk ini:

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

Mirip dengan jawaban yang diterima dengan satu langkah lebih sedikit:

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

//$first_word == 'Test'
pembuat roda
sumber
5

Kalau-kalau Anda tidak yakin string dimulai dengan sebuah kata ...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
Lupuz
sumber
trim($input)akan cukup dalam hal ini: P
zanderwar
4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

Cukup gunakan explode untuk mendapatkan setiap kata dari input dan output elemen pertama dari array yang dihasilkan.

Ulf
sumber
4

Menggunakan fungsi split juga Anda bisa mendapatkan kata pertama dari string.

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
rekha_sri
sumber
5
CATATAN- split () DIHAPUSKAN dari 5,3>
Leo
3

strtoklebih cepat dari extractatau preg_*fungsinya.

HM2K
sumber
2
$ input = "Uji saya lebih banyak";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Uji"
markcial
sumber
2

secara pribadi strsplit/ explode/ strtoktidak mendukung batas kata, jadi untuk mendapatkan pemisahan yang lebih tepat gunakan ekspresi reguler dengan\w

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

Ini akan membagi kata dengan batas sampai batas 1.

RobertPitt
sumber
RobertPitt -> Akan sangat membantu jika Anda memberikan contoh di mana strtok gagal dengan batas kata dibandingkan dengan 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;

Salam, Ciul

Ciul
sumber
Ini akan menjadi jawaban terbaik, karena ini juga berfungsi untuk "satu, dua dan tiga" (jawaban yang diterima akan menggemakan "satu,")
patrick
1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}
RafayAhmed
sumber
1

Anda dapat melakukannya menggunakan substr fungsi fungsi PHP tanpa menggabungkan string ke dalam array.

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

// keluaran S

Afraz Ahmad
sumber
Solusi hebat untuk menerima surat pertama permintaan MySQL untuk mengenali operasi permintaan seperti Select, Insert or Update
Intacto
0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
ghostdog74
sumber
0

Fungsi yang akan mengubah string menjadi dua bagian, kata pertama dan string yang tersisa.

Nilai Pengembalian: Masing-masing akan memiliki firstdan remainingmemasukkan dalam $returnarray. cek pertama strpos( $title," ") !== falseadalah wajib jika string hanya memiliki satu kata dan tidak ada ruang di dalamnya.

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
sumber
0

$ first_word = str_word_count (1) [0]

Tidak berfungsi pada karakter khusus, dan akan menghasilkan perilaku yang salah jika karakter khusus digunakan. Itu tidak ramah UTF-8.

Untuk info lebih lanjut, periksa apakah PHP str_word_count () multibyte aman?

Anders Lund
sumber
0

Karena Anda tidak dapat memeriksa dengan stroke untuk huruf besar atau kecil, ini berfungsi dengan baik untuk memeriksa kata pertama.

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

Pertanyaan Anda dapat dirumuskan ulang sebagai "ganti string pertama dengan ruang dan semua yang tidak diikuti". Jadi ini dapat dicapai dengan ekspresi reguler sederhana:

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

Saya telah menambahkan panggilan opsional ke ltrim () agar aman: fungsi ini menghilangkan spasi di awal string.

Clément Moulin - SimpleRezo
sumber
0

Semua jawaban di sini menggunakan pendekatan yang dibutuhkan prosesor untuk mencari semua string bahkan jika kata pertama ditemukan! Untuk string besar, ini tidak disarankan. Pendekatan ini optimal:

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

Jika Anda ingin tahu seberapa cepat masing-masing fungsi masing adalah, aku berlari beberapa mentah benchmarking di PHP 7.3 pada enam yang paling sebagai jawaban di sini ( strposdengan substr, explodedengan current, strstr, explodedengan trim, str_word_countdan strtok) dengan 1.000.000 iterasi masing-masing untuk membandingkan kecepatan mereka.

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

?>

Berikut adalah hasil yang bervariasi dari 2 kali berturut-turut:

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

Dan hasilnya setelah membalik urutan fungsi:

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

Kesimpulan Ternyata kecepatan antara fungsi-fungsi ini sangat bervariasi dan tidak konsisten antara tes berjalan seperti yang Anda harapkan. Menurut tes cepat dan kotor ini, salah satu dari enam fungsi yang dipilih akan menyelesaikan pekerjaan dalam jumlah waktu yang wajar. Ada gangguan termasuk proses lain yang berjalan yang mengganggu waktu eksekusi. Jadi gunakan saja fungsi apa pun yang masuk akal bagi Anda sebagai seorang programmer. Untuk gambaran pemrograman yang lebih besar, lihat Pemrograman Sastra Donald Knuth .

Improv
sumber