PHP'de bir cümlenin ilk kelimesini nasıl alabilirim?


Yanıtlar:


254

Patlama işlevini aşağıdaki gibi kullanabilirsiniz :

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

100 yapalım, bana yardım et :)
Shivam Pandya

41
Modern PHP sözdizimini kullanarak şunları yapabilirsinizexplode(' ',trim($myvalue))[0]
Elly Post

2
Herhangi bir PHP sürümü için 1 satır kodu:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

3
@ CédricFrançoys limit, dizgenin geri kalanını içeren son öğeyi içermesi gerektiğinden parametre 2 olmalıdır; 1 sadece aynı dizeyi döndürür. Büyük bir dizi oluşturulamazsa, tek bir astar için Elliot sürümü ile giderdim.
Sdlion

RSS NewYorkTimes'ın yanı sıra ikinci kelimeyi de istiyorsanız - media: credit - <media: credit> New York Times için Dmitry Kostyukov </ media: credit>. Sadece Dmitry Kostyukov'u istiyorum - Bunu nasıl yaparım? =)

282

Bir dizgiyi bazı ayırıcılara göre daha küçük dizelere ( belirteçlere ) bölmek için kullanılabilen bir dize işlevi ( strtok ) vardır . Bu iş parçacığının amaçları doğrultusunda, ilk kelime (ilk boşluk karakterinden önce herhangi bir şey olarak tanımlanır) , boşluk karakteri üzerindeki dizgiyi tokenleştirerek elde edilebilir .Test me more

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

Daha fazla ayrıntı ve örnek için strtok PHP kılavuz sayfasına bakınız .


3
Briliiant! Orijinal çözümden daha iyi
Alberto Fontana

Bu ilk cevap olmalı. Sadece istediği gibi ilk kelimeyi daha temiz bir şekilde döndürür.
Wes

2
İyi bir çözüm ama php kılavuzunda uyarıyor: Bu işlev Boole FALSE döndürebilir, ancak FALSE olarak değerlendirilen Boolean olmayan bir değer de döndürebilir.
Jay Harris

1
PHP'yi en az 6 yıl boyunca günlük olarak kullanıyorum ve şimdiye kadar bu işlevi duymadım
Epoc

2
strtokküresel bir devleti elinde tutan garip ve tehlikeli bir işlevdir. Bu işlevi kullanmaktan vazgeçilmelidir.
Arnold Daniels

39

PHP 5.3 sürümüne sahipseniz

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

eğer $myvaluetek kelimeli bir dize strstrbu durumda hiçbir şey döndürmez. Çözüm, test dizesine boşluk eklemek olabilir:

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

Dizede sadece bir kelime olsa bile, her zaman dizenin ilk kelimesini döndürür

Alternatif şudur:

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

Ya da patlamayı kullanarak, bu kadar çok cevabı var.


1
Patlama veya normal ifade kullanmadığınız için +1 (her ikisi de uygunsuz imho). Başka bir alternatif de, strstr'den iğneden sonraki parçayı hiçbir şeyle değiştirmeden strstr'yi str_replace ile kullanmak olacaktır.
Gordon

1
Daha önce olmadığı için strstrPHP'de mevcut olmasına rağmen , isteğe bağlı parametre (bu örnekte kullandığınız) eklendiğinde dikkat çekiyor . Sadece bir uyarı, çünkü kafam karıştı, neden söylüyorsun, bu örneğin ihtiyacı var . 4.3.05.3.0before_needle5.3.0
trejder

Değerimi tek bir kelimeye ayarlarsanız strstr bu durumda hiçbir şey döndürmez! Bir çözüm, test edilen dizenin sonuna her zaman bir boşluk eklemek olabilir, böylece dizedeki tek kelime olsa bile her zaman ilk kelimeyle geri gelir!
patrick

1
Yalnızca kelimeler arasındaki boşlukların riskli olduğunu varsayarsak, sekmeler de eklerdim.

olmamalıecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah


13

Biraz geç olsa da, PHP'nin bunun için daha iyi bir çözümü var:

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

7

Daha az bir adımla kabul edilen cevaba benzer:

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

//$first_word == 'Test'

5

Dizenin bir sözcükle başladığından emin değilseniz ...

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

trim($input)Bu örnekte yeterli olur: P
zanderwar

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

Sadece girişin her kelimesini almak ve sonuçta ortaya çıkan dizinin ilk elemanını patlatmak için patla.


4

Bölme işlevini kullanarak dizeden ilk sözcüğü de alabilirsiniz.

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

5
NOT - split (), 5.3>
Leo


2
$ input = "Beni daha fazla test et";
echo preg_replace ("/ \ s. * $ /", "", $ girdi); // "Ölçek"

2

kişisel olarak strsplit/ explode/ strtokkelime sınırlarını desteklemediğinden, daha keskin bir bölünme elde etmek için\w

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

Bu, sınırları olan kelimeleri 1 sınırına böler.


RobertPitt -> strtok'un bir preg_split ile karşılaştırıldığında bir sözcük sınırıyla başarısız olduğu bir örnek vermeniz faydalı olacaktır.
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;

Saygılarımızla, Ciul


Bu aynı zamanda en iyi cevap olacaktır, çünkü aynı zamanda "bir, iki ve üç" için de geçerlidir (kabul edilen cevap "bir" yankılanacaktır)
patrick

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

1

Dizeye dize eklemeden PHP dize işlevi substr kullanarak yapabilirsiniz.

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

//çıktılar


Seç, Ekle veya Güncelle gibi sorgu işlemlerini tanımak için MySQL sorgusunun ilk harfini almak için harika bir çözüm
Intacto 28:19

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

0

Dizeyi, ilk sözcük ve kalan dize olmak üzere iki parçaya ayıracak işlev.

Dönüş Değeri: Sırasıyla diziye sahip olacak firstve remaininganahtar $returngirecektir. strpos( $title," ") !== falsedize içinde tek bir kelime varsa ve içinde boşluk yoksa ilk kontrol zorunludur.

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

Strok ile büyük veya küçük harf olup olmadığını kontrol edemeyeceğinizden, bu ilk kelimeyi kontrol etmek için mükemmel bir şekilde çalışır.

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

0

Sorunuz, "ilk boşlukta dizeyi ve hiçbir şeyi izlemeyen her şeyi dizede değiştir" şeklinde yeniden formüle edilebilir. Böylece bu basit bir düzenli ifade ile elde edilebilir:

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

Güvenli olması için ltrim () isteğe bağlı bir çağrı ekledim: Bu işlev dizenin başında boşlukları kaldırın.


0

Buradaki tüm cevaplar, ilk kelime bulunsa bile işlemcinin tüm dizeyi araması gereken bir yaklaşım kullanıyor! Büyük dizeler için bu önerilmez. Bu yaklaşım en uygunudur:

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

0

Bu, ilgili işlevlerin her ne kadar hızlı öğrenmek istiyorsanız, ben çoğu burada cevapları olarak Altı yönünde PHP 7.3 kıyaslama bazı ham ran ( strposile substr, explodeile current, strstr, explodeile trim, str_word_countve strtokbunların hızlarını karşılaştırmak için 1.000.000 tekrarlamalar her biri).

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

?>

İşte arka arkaya 2 koşunun değişen sonuçları:

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

Ve işlevlerin sırasını ters çevirdikten sonra sonuçlar:

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

Sonuç Bu işlevler arasındaki hızın büyük ölçüde değiştiği ve test sürüşleri arasında beklediğiniz kadar tutarlı olmadığı anlaşılmaktadır. Bu hızlı ve kirli testlere göre, seçilen altı işlevden herhangi biri işi makul bir sürede yapacak. Yürütme sürelerine müdahale eden diğer işlemleri de içeren bozulmalar vardır. Bu nedenle, bir programcı olarak size en pratik ve okunabilir anlamı olan herhangi bir işlevi kullanın. Daha büyük programlama resmi için bkz. Donald Knuth'un Edebi Programlama .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.