ฉันต้องการแยกคำแรกของตัวแปรออกจากสตริง ตัวอย่างเช่นรับข้อมูลนี้:
<?php $myvalue = 'Test me more'; ?>
เอาต์พุตผลลัพธ์ควรTest
เป็นคำแรกของอินพุต ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการแยกคำแรกของตัวแปรออกจากสตริง ตัวอย่างเช่นรับข้อมูลนี้:
<?php $myvalue = 'Test me more'; ?>
เอาต์พุตผลลัพธ์ควรTest
เป็นคำแรกของอินพุต ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถใช้ฟังก์ชั่นการระเบิดดังต่อไปนี้:
$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
พารามิเตอร์ควรเป็น 2 เนื่องจากต้องรวมองค์ประกอบสุดท้ายที่มีส่วนที่เหลือของสตริง 1 จะส่งคืนสตริงเดียวกันมาก ถ้าหากไม่มีอาร์เรย์ขนาดใหญ่ที่จะถูกสร้างฉันจะไปกับ Elliot version สำหรับซับเดียว
มีฟังก์ชั่นสตริง ( strtok ) ซึ่งสามารถใช้ในการแบ่งสตริงเป็นสตริงที่มีขนาดเล็กลง ( โทเค็น ) ตามตัวคั่นบางตัว สำหรับวัตถุประสงค์ของเธรดนี้คำแรก (กำหนดเป็นอะไรก็ได้ก่อนอักขระช่องว่างแรก) ของTest me more
สามารถรับได้โดยโทเค็นสตริงบนอักขระช่องว่าง
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
สำหรับรายละเอียดเพิ่มเติมและตัวอย่างให้ดูstrtok PHP หน้าคู่มือ
strtok
เป็นฟังก์ชั่นที่แปลกและอันตรายที่ดำรงอยู่ในระดับโลก การใช้ฟังก์ชั่นนี้ควรจะหมดกำลังใจ
ถ้าคุณมี 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 );
หรือการใช้ระเบิดซึ่งมีคำตอบมากมายที่ใช้มันฉันไม่ต้องกังวลว่าจะทำยังไง
strstr
จะมีใน PHP เนื่องจาก4.3.0
ไม่เคยมีมาก่อน5.3.0
เมื่อมีการเพิ่มพารามิเตอร์ทางเลือกbefore_needle
(ซึ่งคุณใช้ในตัวอย่างนี้) 5.3.0
เพียงแค่แจ้งให้ทราบล่วงหน้าเพราะผมสับสนทำไมคุณรัฐว่าตัวอย่างนี้ความต้องการ
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
คุณสามารถทำได้
echo current(explode(' ',$myvalue));
แม้ว่าจะช้าไปหน่อย แต่ PHP ก็มีวิธีแก้ปัญหาที่ดีกว่านี้:
$words=str_word_count($myvalue, 1);
echo $words[0];
คล้ายกับคำตอบที่ยอมรับได้ในขั้นตอนเดียวที่น้อยกว่า:
$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];
//$first_word == 'Test'
ในกรณีที่คุณไม่แน่ใจว่าสตริงเริ่มต้นด้วยคำ ...
$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
trim($input)
จะพอเพียงในกรณีนี้: P
<?php
$value = "Hello world";
$tokens = explode(" ", $value);
echo $tokens[0];
?>
เพียงใช้ explode เพื่อให้ได้ทุกคำของอินพุตและเอาต์พุตอิลิเมนต์แรกของอาร์เรย์ผลลัพธ์
การใช้ฟังก์ชั่นแบบแยกส่วนคุณจะได้คำแรกจากสตริง
<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
$ input = "ทดสอบเพิ่มเติม"; echo preg_replace ("/ \ s. * $ /", "", $ อินพุต); // "ทดสอบ"
เป็นการส่วนตัวstrsplit
/ explode
/ strtok
ไม่สนับสนุนขอบเขตของคำดังนั้นเพื่อให้ได้การแบ่งแยกที่มีการแยกมากขึ้นให้ใช้นิพจน์ทั่วไปกับ\w
preg_split('/[\s]+/',$string,1);
สิ่งนี้จะแบ่งคำที่มีขอบเขต จำกัด ไว้ที่ 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
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
คุณสามารถทำได้โดยใช้สตริงฟังก์ชั่นสตริง PHP โดยไม่ต้องแปลงสตริงเป็นอาร์เรย์
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// ผลลัพธ์ S
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];
ฟังก์ชั่นที่จะโทเค็นสตริงเป็นสองส่วนคำแรกและสตริงที่เหลือ
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;
}
$ first_word = str_word_count (1) [0]
ไม่ทำงานกับอักขระพิเศษและจะส่งผลให้ทำงานผิดปกติหากใช้อักขระพิเศษ มันไม่เป็นมิตรกับ UTF-8
สำหรับการตรวจสอบข้อมูลเพิ่มเติมPHP str_word_count () multibyte ปลอดภัยหรือไม่?
เนื่องจากคุณไม่สามารถตรวจสอบกับ strok สำหรับด้านบนหรือตัวพิมพ์เล็กงานนี้อย่างสมบูรณ์แบบสำหรับการตรวจสอบคำแรก
if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }
คำถามของคุณอาจถูกจัดรูปแบบใหม่เป็น "แทนที่ในสตริงที่ช่องว่างแรกและทุกสิ่งที่ตามมาโดยไม่มีอะไร" ดังนั้นสิ่งนี้สามารถเกิดขึ้นได้ด้วยนิพจน์ทั่วไปอย่างง่าย:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
ฉันได้เพิ่มตัวเลือกการเรียกไปยัง ltrim () เพื่อความปลอดภัย: ฟังก์ชั่นนี้จะลบช่องว่างที่จุดเริ่มต้นของสตริง
คำตอบทั้งหมดที่นี่ใช้วิธีการที่โปรเซสเซอร์ต้องการค้นหาสตริงทั้งหมดแม้ว่าจะพบคำแรก! สำหรับสตริงขนาดใหญ่ไม่แนะนำให้ทำเช่นนี้ วิธีนี้เหมาะสมที่สุด:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
หากคุณต้องการที่จะรู้ว่าวิธีการที่รวดเร็วแต่ละฟังก์ชั่นที่เกี่ยวข้องเหล่านี้คือผมวิ่งบางเปรียบเทียบน้ำมันดิบใน 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 ของการเขียนโปรแกรมความรู้ด้าน
s($str)->words()[0]
ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้