Odpowiedzi:
Funkcji wybuchania można użyć w następujący sposób:
$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
parametr powinien wynosić 2, ponieważ musi zawierać ostatni element, który zawiera resztę ciągu; 1 zwróciłby ten sam ciąg. O ile nie powstanie duża tablica, wybrałbym wersję Elliota dla jednej wkładki.
Istnieje funkcja tekstowa ( strtok ), której można użyć do podzielenia łańcucha na mniejsze ciągi ( tokeny ) w oparciu o niektóre separatory. Na potrzeby tego wątku pierwsze słowo (zdefiniowane jako cokolwiek przed pierwszym znakiem spacji) Test me more
można uzyskać przez tokenizację ciągu znaków spacji.
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
Aby uzyskać więcej informacji i przykładów, zobacz stronę podręcznika PHP strtok .
strtok
to dziwna i niebezpieczna funkcja, która utrzymuje stan globalny. Należy odradzać korzystanie z tej funkcji.
Jeśli masz PHP 5.3
$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);
zwróć uwagę, że if $myvalue
jest łańcuchem zawierającym jedno słowo strstr
, w tym przypadku nic nie zwraca. Rozwiązaniem mogłoby być dodanie spacji do ciągu testowego:
echo strstr( $myvalue . ' ', ' ', true );
To zawsze zwróci pierwsze słowo ciągu, nawet jeśli łańcuch zawiera tylko jedno słowo
Alternatywą jest coś takiego:
$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );
Lub używając eksploduj, które ma tak wiele odpowiedzi, nie zawracam sobie głowy wskazywaniem, jak to zrobić.
strstr
jest dostępny w PHP, ponieważ 4.3.0
nie był wcześniej 5.3.0
, kiedy before_needle
dodano opcjonalny parametr (którego używasz w tym przykładzie). Tylko uwaga, bo byłem zdezorientowany, dlaczego twierdzisz, że ten przykład potrzebuje 5.3.0
.
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
Chociaż jest trochę późno, ale PHP ma na to lepsze rozwiązanie:
$words=str_word_count($myvalue, 1);
echo $words[0];
osobiście strsplit
/ explode
/ strtok
nie obsługuje granic słów, więc aby uzyskać bardziej dokładny podział, użyj wyrażenia regularnego z rozszerzeniem\w
preg_split('/[\s]+/',$string,1);
Spowodowałoby to podzielenie słów z granicami do 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;
Pozdrawiam Ciul
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
Możesz to zrobić za pomocą funkcji ciąg znaków PHP bez konwertowania ciągu na tablicę.
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// wyjście S
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
Funkcja, która podzieli łańcuch na dwie części, pierwsze słowo i pozostały ciąg.
Wartość zwracana: będzie miała odpowiednio first
i remaining
klucz w $return
tablicy. pierwsze sprawdzenie strpos( $title," ") !== false
jest obowiązkowe w przypadku, gdy łańcuch ma tylko jedno słowo i nie ma w nim spacji.
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]
Nie działa ze znakami specjalnymi i spowoduje nieprawidłowe zachowanie, jeśli zostaną użyte znaki specjalne. Nie jest przyjazny dla UTF-8.
Aby uzyskać więcej informacji, sprawdź, czy wielobajtowe bezpieczeństwo PHP str_word_count () jest bezpieczne?
Twoje pytanie można przeformułować jako „zastąp w ciągu znaków pierwszą spację i wszystko następujące po nim nic”. Można to osiągnąć za pomocą prostego wyrażenia regularnego:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
Dla bezpieczeństwa dodałem opcjonalne wywołanie ltrim (): ta funkcja usuwa spacje na początku łańcucha.
Wszystkie odpowiedzi tutaj wykorzystują podejście, zgodnie z którym procesor musi przeszukać cały ciąg, nawet jeśli zostanie znalezione pierwsze słowo! W przypadku dużych strun nie jest to zalecane. To podejście jest optymalne:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
Jeśli chcesz wiedzieć, jak szybko każdy z tych odpowiednich funkcji jest pobiegłem trochę surowej analizy porównawczej w PHP 7.3 na sześciu najbardziej głosowało odpowiedź tutaj ( strpos
z substr
, explode
z current
, strstr
, explode
z trim
, str_word_count
i strtok
) z 1.000.000 powtórzeń każdego porównać ich prędkości.
<?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>';
?>
Oto różne wyniki z 2 kolejnych przebiegów:
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
A wyniki po odwróceniu kolejności funkcji:
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
Wniosek Okazuje się, że szybkość między tymi funkcjami jest bardzo różna i nie jest tak spójna między przebiegami testów, jak można by się spodziewać. Zgodnie z tymi szybkimi i brudnymi testami, każda z sześciu wybranych funkcji wykona zadanie w rozsądnym czasie. Występują zakłócenia, w tym inne uruchomione procesy, które kolidują z czasem wykonywania. Więc po prostu użyj dowolnej funkcji, która jest najbardziej praktyczna i czytelna dla Ciebie jako programisty. Aby uzyskać większy obraz programowania, zobacz Donald Knuth's Literate Programming .
s($str)->words()[0]
pomocny, co znajdziesz w tej samodzielnej bibliotece .