Yanıtlar:
Patlama işlevini aşağıdaki gibi kullanabilirsiniz :
$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
explode(' ',trim($myvalue))[0]
list($firstword) = explode(' ', trim($myvalue), 1);
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.
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 .
strtok
küresel bir devleti elinde tutan garip ve tehlikeli bir işlevdir. Bu işlevi kullanmaktan vazgeçilmelidir.
PHP 5.3 sürümüne sahipseniz
$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);
eğer $myvalue
tek kelimeli bir dize strstr
bu 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.
strstr
PHP'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.0
5.3.0
before_needle
5.3.0
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
Biraz geç olsa da, PHP'nin bunun için daha iyi bir çözümü var:
$words=str_word_count($myvalue, 1);
echo $words[0];
Daha az bir adımla kabul edilen cevaba benzer:
$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];
//$first_word == 'Test'
kişisel olarak strsplit
/ explode
/ strtok
kelime 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.
$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
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
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
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
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 first
ve remaining
anahtar $return
girecektir. strpos( $title," ") !== false
dize 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;
}
$ first_word = str_word_count (1) [0]
Özel karakterler üzerinde çalışmaz ve özel karakterler kullanılırsa yanlış davranışa neden olur. UTF-8 dostu değildir.
Daha fazla bilgi için PHP str_word_count () multibyte güvenlidir?
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.
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;
}
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 ( strpos
ile substr
, explode
ile current
, strstr
, explode
ile trim
, str_word_count
ve strtok
bunları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 .
s($str)->words()[0]
bulunan yardımcı olabilir .