Câu trả lời:
Bạn có thể sử dụng chức năng phát nổ như sau:
$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
tham số nên là 2 vì nó phải bao gồm phần tử cuối cùng chứa phần còn lại của chuỗi; 1 sẽ chỉ trả lại chuỗi rất giống nhau. Trừ khi một mảng lớn sẽ được tạo ra, tôi sẽ đi với phiên bản Elliot cho một lớp lót.
Có một hàm chuỗi ( strtok ) có thể được sử dụng để phân tách một chuỗi thành các chuỗi nhỏ hơn ( mã thông báo ) dựa trên một số dấu phân cách. Đối với mục đích của chuỗi này, từ đầu tiên (được định nghĩa là bất cứ thứ gì trước ký tự khoảng trắng đầu tiên) Test me more
có thể được lấy bằng cách mã hóa chuỗi trên ký tự khoảng trắng .
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
Để biết thêm chi tiết và ví dụ, xem trang hướng dẫn strtok PHP .
strtok
là một chức năng kỳ lạ và nguy hiểm nắm giữ một nhà nước toàn cầu. Sử dụng chức năng này nên được khuyến khích.
Nếu bạn có PHP 5.3
$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);
lưu ý rằng nếu $myvalue
là một chuỗi có một từ strstr
không trả về bất cứ điều gì trong trường hợp này. Một giải pháp có thể là nối thêm một khoảng trắng vào chuỗi thử nghiệm:
echo strstr( $myvalue . ' ', ' ', true );
Điều đó sẽ luôn trả về từ đầu tiên của chuỗi, ngay cả khi chuỗi chỉ có một từ trong đó
Thay thế là một cái gì đó như:
$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );
Hoặc sử dụng explode, có rất nhiều câu trả lời bằng cách sử dụng, tôi sẽ không bận tâm chỉ ra cách thực hiện.
strstr
có sẵn trong PHP vì 4.3.0
nó không có trước đây 5.3.0
, khi tham số tùy chọn before_needle
(mà bạn đang sử dụng trong ví dụ này) đã được thêm vào. Chỉ là một thông báo, bởi vì tôi đã nhầm lẫn, tại sao bạn nêu, ví dụ này cần 5.3.0
.
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
Mặc dù có hơi muộn nhưng PHP có một giải pháp tốt hơn cho việc này:
$words=str_word_count($myvalue, 1);
echo $words[0];
Tương tự như câu trả lời được chấp nhận với một bước ít hơn:
$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];
//$first_word == 'Test'
cá nhân strsplit
/ explode
/ strtok
không hỗ trợ các ranh giới từ, vì vậy để có được sự phân chia dễ dàng hơn, hãy sử dụng biểu thức chính quy với\w
preg_split('/[\s]+/',$string,1);
Điều này sẽ phân chia các từ có ranh giới đến giới hạn 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;
Trân trọng, Ciul
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
Bạn có thể làm điều đó bằng cách sử dụng hàm chuỗi PHP mà không cần chuyển chuỗi thành mảng.
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// đầu ra S
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
Hàm sẽ mã hóa chuỗi thành hai phần, từ đầu tiên và chuỗi còn lại.
Giá trị trả về: Nó sẽ có first
và remaining
khóa trong $return
mảng tương ứng. kiểm tra đầu tiên strpos( $title," ") !== false
là bắt buộc trong trường hợp khi chuỗi chỉ có một từ và không có khoảng trắng trong đó.
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]
Không hoạt động trên các ký tự đặc biệt và sẽ dẫn đến hành vi sai nếu sử dụng các ký tự đặc biệt. Nó không thân thiện với UTF-8.
Để biết thêm thông tin kiểm tra xem PHP str_word_count () multibyte có an toàn không?
Câu hỏi của bạn có thể được định dạng lại là "thay thế trong chuỗi không gian đầu tiên và mọi thứ tiếp theo không có gì". Vì vậy, điều này có thể đạt được với một biểu thức chính quy đơn giản:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
Tôi đã thêm một lệnh gọi tùy chọn đến ltrim () để an toàn: hàm này xóa khoảng trắng ở đầu chuỗi.
Tất cả các câu trả lời ở đây đang sử dụng một cách tiếp cận mà bộ xử lý cần tìm kiếm tất cả các chuỗi ngay cả khi tìm thấy từ đầu tiên! Đối với các chuỗi lớn, điều này không được khuyến khích. Cách tiếp cận này là tối ưu:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
Nếu bạn muốn biết nhanh như thế nào mỗi một trong các chức năng tương ứng là, tôi chạy một số thô benchmarking trong PHP 7.3 trên sáu nhất bình chọn câu trả lời ở đây ( strpos
với substr
, explode
với current
, strstr
, explode
với trim
, str_word_count
và strtok
) với 1.000.000 lặp từng để so sánh tốc độ của họ.
<?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>';
?>
Dưới đây là các kết quả khác nhau từ 2 lần chạy liên tiếp:
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
Và kết quả sau khi đảo ngược thứ tự của các hàm:
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
Kết luận Hóa ra tốc độ giữa các chức năng này rất khác nhau và không nhất quán giữa các lần chạy thử như bạn mong đợi. Theo các thử nghiệm nhanh và bẩn này, bất kỳ chức năng nào trong sáu chức năng được chọn sẽ hoàn thành công việc trong một khoảng thời gian hợp lý. Có những nhiễu loạn bao gồm các quá trình khác đang chạy đang can thiệp vào thời gian thực hiện. Vì vậy, chỉ cần sử dụng bất cứ chức năng nào có ý nghĩa thiết thực và dễ đọc nhất đối với bạn như một lập trình viên. Đối với hình ảnh lập trình lớn hơn, xem Lập trình biết chữ của Donald Knuth .
s($str)->words()[0]
hữu ích, như được tìm thấy trong thư viện độc lập này .