วิธีลบอักขระตัวแรกของสตริงใน PHP


คำตอบ:


330

ในการลบทุก:จุดเริ่มต้นของสตริงคุณสามารถใช้ltrim :

$str = '::f:o:';
$str = ltrim($str, ':');
var_dump($str); //=> 'f:o:'

109
โปรดทราบว่า lrtim :::::จะลบทั้งหมด บางครั้งนี่ไม่ใช่พฤติกรรมที่ต้องการ
CoR

5
โปรดทราบว่านี่มีไว้สำหรับตัวอักษรเดียวเท่านั้น ltrim จะตัดแต่งอักขระทั้งหมดในสตริงที่ระบุ: ltrim('prefixprefix_postfix', 'prefix')ผลลัพธ์ใน'_postfix';
Cody Django

556

substr()ฟังก์ชั่นอาจจะช่วยให้คุณที่นี่:

 $str = substr($str, 1);

สตริงถูกทำดัชนีเริ่มต้นจาก 0 และฟังก์ชันนี้พารามิเตอร์ที่สองรับ cutstart ดังนั้นให้ 1 และถ่านแรกที่หายไป


35
ระวังเรื่องยูนิโค้ด หากคุณกำลังจัดการกับสตริงโดยพลการ (เช่น "Ål <- danish for eel") คุณควรใช้ mb_substr และระบุการเข้ารหัส
โทมัสเซ่น

นี่ไม่ใช่การใช้งานที่ถูกต้อง แต่ไม่ได้ทำงานกับสตริงอักขระเดียว "a" ถ้าคุณลองสตริงอักขระเดี่ยว substr ส่งคืนค่าบูลีน
ถึง

2
@anru คู่มือระบุว่าถ้าความยาวสตริงเท่ากับพารามิเตอร์เริ่มต้นสตริงว่างจะถูกส่งคืน ก่อนหน้าเวอร์ชัน 7 falseถูกส่งคืน ดังนั้นคุณจะต้องตรวจสอบว่าพวกเขาเท่าเทียมกันหากนั่นไม่ใช่พฤติกรรมที่คุณต้องการ
rybo111

95

ใช้substr :

$str = substr($str, 1); // this is a applepie :)

คำตอบที่ยอดเยี่ยม! ขอบคุณสำหรับการแบ่งปัน! ไม่แน่ใจว่าฉันเข้าใจความคิดเห็นในรหัสของคุณเกี่ยวกับ applepie อย่างไร oO
HoldOffHunger

64

เวลา Exec สำหรับ 3 คำตอบ:

นำจดหมายฉบับแรกออกโดยเปลี่ยนเคส

$str = "hello";
$str[0] = "";
// $str[0] = false;
// $str[0] = null;
// replaced by �, but ok for echo

เวลา Exec สำหรับ 1.000.000 ทดสอบ: 0.39602184295654วินาที


ลบอักษรตัวแรกด้วย substr ()

$str = "hello";
$str = substr($str, 1);

เวลา Exec สำหรับ 1.000.000 ทดสอบ: 5.153294801712วินาที


ลบอักษรตัวแรกด้วย ltrim ()

$str = "hello";
$str= ltrim ($str,'h');

เวลา Exec สำหรับ 1.000.000 ทดสอบ: 5.2393000125885วินาที


ลบอักษรตัวแรกด้วย preg_replace ()

$str = "hello";
$str = preg_replace('/^./', '', $str);

เวลา Exec สำหรับ 1.000.000 ทดสอบ: 6.8543920516968วินาที


ขอบคุณ ดูการปรับปรุงของฉัน มันทำให้เกิดปัญหากับฉันเมื่อใช้สตริงที่อัพเดตในเคียวรี SQL
rybo111

6
ฉันแค่พยายาม$str[0] = '';แก้ปัญหาและมันไม่ได้ทำงาน อย่างไรก็ตามถ้าคุณวางแผนที่จะใช้ตัวแปรเพื่อเปรียบเทียบ>หรือ<ไม่ได้ผล มันยังคงนับตัวอย่างเช่น + ` $str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'
เอียน

@Ian: ฉันเจอปัญหาเดียวกันในขณะที่ดึงข้อมูลจาก API โดยใช้คำหลักพยายามvar_dump($keyword)ที่แสดงความยาวอักขระก่อนหน้า .. จากนั้นฉันลองตัดคำหลักแล้วก็ใช้งานได้ดีvar_dump(trim($keyword)).. หวังว่านี่จะช่วยคนได้ .. :)
Syed Qarib

3
สิ่งนี้ใช้ไม่ได้ ตำแหน่ง "ถูกลบ" จะถูกแทนที่ด้วยไบต์ว่างดังนั้นคุณจะได้รับ "\ 0hello" แทนที่จะเป็น "สวัสดี"
Josef Kufner

1
ฉันได้รับ "คำเตือน: ไม่สามารถกำหนดสตริงว่างให้กับการชดเชยสตริง" สำหรับ $ str [0] = "";
Francisco Luz


11

ในการลบอักขระตัวแรกของสตริงใน PHP

$string = "abcdef";     
$new_string = substr($string, 1);

echo $new_string;
Generates: "bcdef"


9

ปรับปรุง

หลังจากการทดสอบเพิ่มเติมฉันไม่แนะนำให้ใช้สิ่งนี้อีก มันทำให้เกิดปัญหาสำหรับฉันเมื่อใช้สตริงที่อัพเดตในเคียวรี MySQL และการเปลี่ยนแปลงเพื่อsubstrแก้ไขปัญหา ฉันคิดเกี่ยวกับการลบคำตอบนี้ แต่ความคิดเห็นแนะนำว่ามันเร็วกว่าดังนั้นใครบางคนอาจใช้มัน คุณอาจพบว่าการตัดแต่งสตริงที่อัพเดตช่วยแก้ไขปัญหาความยาวของสตริง


บางครั้งคุณไม่ต้องการฟังก์ชั่น:

$str[0] = '';

ตัวอย่างเช่น:

$str = 'AHello';
$str[0] = '';
echo $str; // 'Hello'

วิธีนี้แก้ไขสตริงที่มีอยู่แทนที่จะสร้างอีกสตริง


ดูเหมือนว่าจะเร็วเกินไป
Emanuil Rusev

@EmanuilRusev เป็นอย่างไร แค่อยากรู้ว่าคุณหมายถึงการพิมพ์เร็วกว่าหรือเร็วกว่า
rybo111

ฉันหมายความว่ามันทำงานได้เร็วขึ้น
Emanuil Rusev

@EmanuilRusev ฉันจะสนใจถ้าคุณสามารถให้สถิติบางอย่างที่ฉันจะเพิ่มคำตอบ
rybo111

1
ต้องระวังสิ่งนี้ รหัสด้านล่างแสดงผลบูล (เท็จ) $ foo = 'book'; $ bar = 'book'; $ bar = substr ($ bar, 1); $ foo [0] = ''; var_dump ($ foo === $ bar);
thoughtrepo

8

คำตอบที่ได้รับการยอมรับ:

$str = ltrim($str, ':');

ใช้งานได้ แต่จะลบหลายรายการ:เมื่อเริ่มต้นมากกว่าหนึ่งครั้ง

$str = substr($str, 1);

จะลบตัวอักษรใด ๆ ตั้งแต่เริ่มต้น

อย่างไรก็ตาม

if ($str[0] === ':')
    $str = substr($str, 1);

ทำงานได้อย่างสมบูรณ์แบบ


6

คุณสามารถใช้ฟังก์ชั่น sbstr ()

$amount = 1;   //where $amount the the amount of string you want to delete starting  from index 0
$str = substr($str, $amount);

2

ตัดแต่งการเกิดขึ้นของทุกคำในอาเรย์จากจุดเริ่มต้นและจุดสิ้นสุดของสตริง + ช่องว่างและตัวเลือกเดียวอักขระพิเศษตามการตัดแต่งปกติ ()

<?php
function trim_words($what, $words, $char_list = '') {
    if(!is_array($words)) return false;
    $char_list .= " \t\n\r\0\x0B"; // default trim chars
    $pattern = "(".implode("|", array_map('preg_quote', $words)).")\b";
    $str = trim(preg_replace('~'.$pattern.'$~i', '', preg_replace('~^'.$pattern.'~i', '', trim($what, $char_list))), $char_list);
    return $str;
}

// for example:
$trim_list = array('AND', 'OR');

$what = ' OR x = 1 AND b = 2 AND ';
print_r(trim_words($what, $trim_list)); // => "x = 1 AND b = 2"

$what = ' ORDER BY x DESC, b ASC, ';
print_r(trim_words($what, $trim_list, ',')); // => "ORDER BY x DESC, b ASC"
?>

1

รหัสทำงานได้ดีสำหรับฉัน

$str = substr($str ,-(strlen($str)-1));

อาจมีส่วนร่วมกับคำตอบด้วย


1
อันนี้ไม่ทำงานกับสายอักขระเดียว: เช่น "a"
anru

คุณพูดถูก =) ดังนั้นเชื่อว่าทางออกที่เป็นไปได้คือการทดสอบก่อนที่จะมีเพียงตัวละครตัวเดียว ตัวอย่างเช่น: $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): $ str; หรือ $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): ''; เพราะความคิดคือการลบตัวอักษรสุดท้ายถ้าคุณมีเพียงหนึ่ง ... : P
Claudionor Oliveira

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