Làm thế nào để có được từ đầu tiên của một câu trong PHP?


155

Tôi muốn trích xuất từ ​​đầu tiên của một biến từ một chuỗi. Ví dụ: lấy đầu vào này:

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

Đầu ra kết quả phải là Test, đó là từ đầu tiên của đầu vào. Tôi có thể làm cái này như thế nào?


Bạn có thể thấy s($str)->words()[0]hữu ích, như được tìm thấy trong thư viện độc lập này .
caw

Câu trả lời:


252

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

Hãy làm cho nó 100, nó giúp tôi :)
Shivam Pandya

40
Sử dụng cú pháp PHP hiện đại mà bạn có thể làmexplode(' ',trim($myvalue))[0]
Elly Post

2
Mã 1 dòng cho bất kỳ phiên bản PHP nào:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

3
@ CédricFrançoys limittham 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.
Sdlion

Điều gì sẽ xảy ra nếu bạn muốn từ thứ hai cũng như từ RSS NewYorkTimes - phương tiện: tín dụng là - <media: credit> Dmitry Kostyukov cho Thời báo New York </ media: credit>. Tôi chỉ muốn Dmitry Kostyukov - Làm thế nào để tôi làm điều đó? =)

282

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 morecó 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 .


3
Sáng chói! Tốt hơn so với giải pháp ban đầu
Alberto Fontana

Đây phải là câu trả lời đầu tiên. Nó chỉ trả về từ đầu tiên như anh ta muốn một cách sạch sẽ hơn.
Wes

2
Giải pháp tốt nhưng trong hướng dẫn sử dụng php, nó cảnh báo: Hàm này có thể trả về Boolean FALSE, nhưng cũng có thể trả về giá trị không Boolean ước tính cho FALSE.
Jay Harris

1
Tôi đang sử dụng PHP hàng ngày trong ít nhất 6 năm và tôi chưa bao giờ nghe về chức năng này cho đến bây giờ
Epoc

2
strtoklà 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.
Arnold Daniels

39

Nếu bạn có PHP 5.3

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

lưu ý rằng nếu $myvaluelà một chuỗi có một từ strstrkhô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.


1
+1 vì không sử dụng explode hoặc regex (cả imho không phù hợp). Một cách khác là sử dụng strstr với str numplace, thay thế phần sau kim từ strstr không có gì.
Gordon

1
Đáng lưu ý, mặc dù strstrcó sẵn trong PHP vì 4.3.0nó 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.
trejder

Lưu ý rằng nếu bạn đặt myvalue thành một từ duy nhất thì strstr sẽ không trả lại bất cứ điều gì trong trường hợp này! Một giải pháp có thể là luôn luôn thêm một khoảng trắng ở cuối chuỗi đã được kiểm tra để nó luôn trở lại với từ đầu tiên, ngay cả khi đó là từ duy nhất trong chuỗi!
patrick

1
Giả sử chỉ có khoảng trắng giữa các từ là rủi ro, tôi cũng bao gồm các tab.

không nên như vậyecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah


13

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];

7

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'

5

Chỉ trong trường hợp bạn không chắc chuỗi bắt đầu bằng một từ ...

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

trim($input)sẽ đủ trong trường hợp này: P
zanderwar

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

Chỉ cần sử dụng explode để lấy từng từ của đầu vào và đầu ra phần tử đầu tiên của mảng kết quả.


4

Sử dụng chức năng phân tách, bạn cũng có thể nhận được từ đầu tiên từ chuỗi.

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

5
LƯU Ý- split () được ĐỔI từ 5.3>
Leo


2
$ input = "Kiểm tra tôi nhiều hơn";
echo preg numplace ("/ \ s. * $ /", "", $ input); // "Kiểm tra"

2

cá nhân strsplit/ explode/ strtokkhô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.


RobertPitt -> Sẽ rất hữu ích nếu bạn đưa ra một ví dụ khi strtok thất bại với ranh giới từ so với 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;

Trân trọng, Ciul


Đây sẽ là câu trả lời tốt nhất, vì nó cũng hoạt động cho "một, hai và ba" (câu trả lời được chấp nhận sẽ lặp lại "một",)
patrick

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

1

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


Giải pháp tuyệt vời để nhận được một chữ cái đầu tiên của truy vấn MySQL để nhận ra thao tác truy vấn như Chọn, Chèn hoặc Cập nhật
Intacto

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

0

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ó firstremainingkhóa trong $returnmảng tương ứng. kiểm tra đầu tiên strpos( $title," ") !== falselà 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;
}


0

Vì bạn không thể kiểm tra bằng nét chữ hoa hoặc chữ thường, điều này hoạt động hoàn hảo để kiểm tra từ đầu tiên.

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

0

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.


0

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;
}

0

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 ( strposvới substr, explodevới current, strstr, explodevới trim, str_word_countstrtok) 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 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.