จะหาคำแรกของประโยคใน PHP ได้อย่างไร?


156

ฉันต้องการแยกคำแรกของตัวแปรออกจากสตริง ตัวอย่างเช่นรับข้อมูลนี้:

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

เอาต์พุตผลลัพธ์ควรTestเป็นคำแรกของอินพุต ฉันจะทำสิ่งนี้ได้อย่างไร


คุณอาจพบว่ามีs($str)->words()[0]ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้
caw

คำตอบ:


254

คุณสามารถใช้ฟังก์ชั่นการระเบิดดังต่อไปนี้:

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

ช่วยทำให้มัน 100 ความช่วยเหลือของฉัน :)
Shivam พานเดรีย

41
การใช้ไวยากรณ์ PHP ที่ทันสมัยคุณสามารถทำได้explode(' ',trim($myvalue))[0]
Elly Post

2
รหัส 1 บรรทัดสำหรับเวอร์ชัน PHP ใด ๆ :list($firstword) = explode(' ', trim($myvalue), 1);
CédricFrançoys

3
@ CédricFrançoys limitพารามิเตอร์ควรเป็น 2 เนื่องจากต้องรวมองค์ประกอบสุดท้ายที่มีส่วนที่เหลือของสตริง 1 จะส่งคืนสตริงเดียวกันมาก ถ้าหากไม่มีอาร์เรย์ขนาดใหญ่ที่จะถูกสร้างฉันจะไปกับ Elliot version สำหรับซับเดียว
Sdlion

จะเป็นอย่างไรถ้าคุณต้องการคำที่สองรวมถึงจาก RSS NewYorkTimes - สื่อ: เครดิตคือ - <media: credit> Dmitry Kostyukov สำหรับ The New York Times </ media: credit> ฉันต้องการ Dmitry Kostyukov - ฉันจะทำอย่างไร =)

282

มีฟังก์ชั่นสตริง ( strtok ) ซึ่งสามารถใช้ในการแบ่งสตริงเป็นสตริงที่มีขนาดเล็กลง ( โทเค็น ) ตามตัวคั่นบางตัว สำหรับวัตถุประสงค์ของเธรดนี้คำแรก (กำหนดเป็นอะไรก็ได้ก่อนอักขระช่องว่างแรก) ของTest me moreสามารถรับได้โดยโทเค็นสตริงบนอักขระช่องว่าง

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

สำหรับรายละเอียดเพิ่มเติมและตัวอย่างให้ดูstrtok PHP หน้าคู่มือ


3
Briliiant! ดีกว่าโซลูชันเดิม
Alberto Fontana

นี่ควรเป็นคำตอบแรก เพียงส่งกลับคำแรกเหมือนที่เขาต้องการในวิธีที่สะอาดกว่า
Wes

2
คำตอบที่ดี แต่ในคู่มือ php คำเตือน: ฟังก์ชั่นนี้อาจส่งกลับค่าบูลีน FALSE แต่อาจส่งคืนค่าที่ไม่ใช่บูลีนซึ่งประเมินค่าเป็น FALSE
Jay Harris

1
ฉันใช้ PHP เป็นประจำทุกวันเป็นเวลาอย่างน้อย 6 ปีและฉันไม่เคยได้ยินเกี่ยวกับฟังก์ชั่นนี้มาก่อนจนถึงตอนนี้
Epoc

2
strtokเป็นฟังก์ชั่นที่แปลกและอันตรายที่ดำรงอยู่ในระดับโลก การใช้ฟังก์ชั่นนี้ควรจะหมดกำลังใจ
อาร์โนลด์แดเนียลส์

39

ถ้าคุณมี PHP 5.3

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

โปรดทราบว่าถ้า$myvalueเป็นสตริงที่มีหนึ่งคำstrstrจะไม่ส่งคืนสิ่งใดในกรณีนี้ วิธีแก้ปัญหาคือการผนวกช่องว่างกับสตริงทดสอบ:

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

นั่นจะส่งคืนคำแรกของสตริงเสมอแม้ว่าสตริงจะมีเพียงคำเดียว

ทางเลือกคือสิ่งที่ชอบ:

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

หรือการใช้ระเบิดซึ่งมีคำตอบมากมายที่ใช้มันฉันไม่ต้องกังวลว่าจะทำยังไง


1
+1 สำหรับไม่ใช้ explode หรือ regex (ทั้ง imho ไม่เหมาะสม) อีกทางเลือกหนึ่งคือการใช้ strstr กับ str_replace แทนที่ส่วนหลังจากเข็มจาก strstr โดยไม่มีอะไร
Gordon

1
น่าสังเกตว่าถึงแม้ว่าstrstrจะมีใน PHP เนื่องจาก4.3.0ไม่เคยมีมาก่อน5.3.0เมื่อมีการเพิ่มพารามิเตอร์ทางเลือกbefore_needle(ซึ่งคุณใช้ในตัวอย่างนี้) 5.3.0เพียงแค่แจ้งให้ทราบล่วงหน้าเพราะผมสับสนทำไมคุณรัฐว่าตัวอย่างนี้ความต้องการ
trejder

โปรดทราบว่าหากคุณตั้งค่า myvalue เป็น strstr คำเดียวจะไม่ส่งคืนสิ่งใดในกรณีนี้! วิธีแก้ปัญหาคือการเพิ่มช่องว่างที่ส่วนท้ายของสตริงที่ทดสอบเสมอดังนั้นจึงกลับมาพร้อมกับคำแรกแม้ว่าจะเป็นคำเดียวในสตริง!
patrick

1
สมมติว่ามีช่องว่างระหว่างคำเท่านั้นที่มีความเสี่ยงฉันจะรวมแท็บด้วย

ไม่ควรจะเป็นecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah



7

คล้ายกับคำตอบที่ยอมรับได้ในขั้นตอนเดียวที่น้อยกว่า:

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

//$first_word == 'Test'

5

ในกรณีที่คุณไม่แน่ใจว่าสตริงเริ่มต้นด้วยคำ ...

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

trim($input)จะพอเพียงในกรณีนี้: P
zanderwar

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

เพียงใช้ explode เพื่อให้ได้ทุกคำของอินพุตและเอาต์พุตอิลิเมนต์แรกของอาร์เรย์ผลลัพธ์


4

การใช้ฟังก์ชั่นแบบแยกส่วนคุณจะได้คำแรกจากสตริง

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

5
NOTE- split () ถูกยกเลิกจาก 5.3>
Leo



2

เป็นการส่วนตัวstrsplit/ explode/ strtokไม่สนับสนุนขอบเขตของคำดังนั้นเพื่อให้ได้การแบ่งแยกที่มีการแยกมากขึ้นให้ใช้นิพจน์ทั่วไปกับ\w

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

สิ่งนี้จะแบ่งคำที่มีขอบเขต จำกัด ไว้ที่ 1


RobertPitt -> มันจะมีประโยชน์ถ้าคุณยกตัวอย่างที่ strtok ล้มเหลวด้วยขอบเขตของคำเมื่อเทียบกับ 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;

ขอแสดงความนับถือ Ciul


นี่จะเป็นคำตอบที่ดีที่สุดเพราะมันใช้งานได้กับ "หนึ่งสองและสาม" (คำตอบที่ยอมรับจะสะท้อน "หนึ่ง")
patrick

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

1

คุณสามารถทำได้โดยใช้สตริงฟังก์ชั่นสตริง PHP โดยไม่ต้องแปลงสตริงเป็นอาร์เรย์

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

// ผลลัพธ์ S


โซลูชั่นที่ยอดเยี่ยมในการรับตัวอักษร MySQL ตัวแรกเพื่อจดจำการทำงานของแบบสอบถามเช่น Select, Insert หรือ Update
Intacto


0

ฟังก์ชั่นที่จะโทเค็นสตริงเป็นสองส่วนคำแรกและสตริงที่เหลือ

Return Value:มันจะมีfirstและremainingคีย์ใน$returnอาร์เรย์ตามลำดับ การตรวจสอบครั้งแรกstrpos( $title," ") !== falseเป็นสิ่งจำเป็นในกรณีที่สตริงมีเพียงหนึ่งคำและไม่มีที่ว่างในนั้น

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

$ first_word = str_word_count (1) [0]

ไม่ทำงานกับอักขระพิเศษและจะส่งผลให้ทำงานผิดปกติหากใช้อักขระพิเศษ มันไม่เป็นมิตรกับ UTF-8

สำหรับการตรวจสอบข้อมูลเพิ่มเติมPHP str_word_count () multibyte ปลอดภัยหรือไม่?


0

เนื่องจากคุณไม่สามารถตรวจสอบกับ strok สำหรับด้านบนหรือตัวพิมพ์เล็กงานนี้อย่างสมบูรณ์แบบสำหรับการตรวจสอบคำแรก

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

0

คำถามของคุณอาจถูกจัดรูปแบบใหม่เป็น "แทนที่ในสตริงที่ช่องว่างแรกและทุกสิ่งที่ตามมาโดยไม่มีอะไร" ดังนั้นสิ่งนี้สามารถเกิดขึ้นได้ด้วยนิพจน์ทั่วไปอย่างง่าย:

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

ฉันได้เพิ่มตัวเลือกการเรียกไปยัง ltrim () เพื่อความปลอดภัย: ฟังก์ชั่นนี้จะลบช่องว่างที่จุดเริ่มต้นของสตริง


0

คำตอบทั้งหมดที่นี่ใช้วิธีการที่โปรเซสเซอร์ต้องการค้นหาสตริงทั้งหมดแม้ว่าจะพบคำแรก! สำหรับสตริงขนาดใหญ่ไม่แนะนำให้ทำเช่นนี้ วิธีนี้เหมาะสมที่สุด:

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

0

หากคุณต้องการที่จะรู้ว่าวิธีการที่รวดเร็วแต่ละฟังก์ชั่นที่เกี่ยวข้องเหล่านี้คือผมวิ่งบางเปรียบเทียบน้ำมันดิบใน PHP 7.3 ในหกส่วนใหญ่ได้รับการโหวตคำตอบได้ที่นี่ ( strposมีsubstr, explodeกับcurrent, strstr, explodeกับtrim, str_word_countและstrtok) กับ 1,000,000 ซ้ำแต่ละเพื่อเปรียบเทียบความเร็วของพวกเขา

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

?>

นี่คือผลลัพธ์ที่แตกต่างจากการวิ่งติดต่อกัน 2 ครั้ง:

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

และผลลัพธ์หลังจากการกลับคำสั่งของฟังก์ชั่น:

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

สรุปผลปรากฏว่าความเร็วระหว่างฟังก์ชั่นเหล่านี้แตกต่างกันอย่างมากและไม่สอดคล้องกันระหว่างการทดสอบที่คุณอาจคาดหวัง จากการทดสอบที่รวดเร็วและสกปรกเหล่านี้ฟังก์ชั่นทั้งหกที่เลือกจะทำให้งานเสร็จภายในเวลาอันสมควร มีการก่อกวนรวมถึงกระบวนการอื่น ๆ ที่กำลังทำงานที่รบกวนเวลาการดำเนินการ ดังนั้นเพียงแค่ใช้ฟังก์ชั่นอะไรก็ตามที่เหมาะสมกับคุณในฐานะโปรแกรมเมอร์ สำหรับภาพเขียนโปรแกรมใหญ่เห็นโดนัลด์ Knuth ของการเขียนโปรแกรมความรู้ด้าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.