วิธีรับทุกสิ่งหลังจากตัวละครบางตัว?


140

ฉันมีสตริงและฉันต้องการได้รับทุกอย่างหลังจากค่าที่แน่นอน สตริงจะเริ่มต้นด้วยชุดของตัวเลขแล้วขีดเส้นใต้เสมอ ฉันต้องการรับสตริงที่เหลือหลังจากการขีดเส้นใต้ ตัวอย่างเช่นถ้าฉันมีสตริงต่อไปนี้และสิ่งที่ฉันต้องการคืน:

"123_String" -> "String"
"233718_This_is_a_string" -> "This_is_a_string"
"83_Another Example" -> "Another Example"

ฉันจะทำอะไรเช่นนี้ได้อย่างไร

คำตอบ:


333

strpos()พบ offset ของขีดแล้ว substr คว้าทุกอย่างจากดัชนีที่บวก 1 เป็นต้นไป

$data = "123_String";    
$whatIWant = substr($data, strpos($data, "_") + 1);    
echo $whatIWant;

หากคุณต้องการตรวจสอบว่ามีอักขระขีดล่าง ( _) อยู่ในสตริงของคุณก่อนที่จะลองใช้หรือไม่คุณสามารถใช้สิ่งต่อไปนี้:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}

2
สิ่งที่ดีที่สุดในการตรวจสอบว่ามีขีดเส้นใต้อยู่หรือไม่เช่นนั้นเป็นตัวเลือก
John Magnolia

2
@JohnMagnolia: จากนั้นคุณสามารถใช้if (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@JohnMagnolia substr($data, (strrpos($data, '_') ?: -1) +1)หรือน้อยแฟนซีหนึ่งซับ:
ไข้หวัดใหญ่

2
@flu ฉันคิดว่าคุณตั้งใจจะพูดอ่านยากขึ้น IMO บรรทัดที่น้อยกว่าไม่ได้หมายถึงนักเล่น
MH

ฟังก์ชั่นนี้จะคืนค่าสตริงหลังจาก substring / char หรือ false ถ้าไม่พบเข็ม:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtokเป็นฟังก์ชั่นที่ถูกมองข้ามสำหรับสิ่งนี้ มันมีความหมายค่อนข้างเร็ว

$s = '233718_This_is_a_string';
$firstPart = strtok( $s, '_' );
$allTheRest = strtok( '' ); 

สตริงว่างเช่นนี้จะบังคับให้ส่งคืนส่วนที่เหลือของสตริง

หมายเหตุหากไม่มีอะไรหลังจาก '_' คุณจะได้รับFALSEค่าตาม$allTheRestที่ระบุไว้ในเอกสารจะต้องทดสอบด้วย === เพื่อแยกความแตกต่างจากค่าเท็จอื่น ๆ


3
ระวัง: strtok จะกลับมาเป็นส่วนหนึ่งของสตริงหลังจากที่ตัวละครถ้ามันเป็นตัวอักษรตัวแรกในสตริงเช่นstrtok('a_b', '_')จะกลับมาaแต่strtok('_b', '_')จะกลับมาbไม่สตริงที่ว่างเปล่าที่คุณคาดหวัง
ควินน์ Comendant

9

นี่คือวิธีการโดยใช้explode:

$text = explode('_', '233718_This_is_a_string', 2)[1]; // Returns This_is_a_string

หรือ:

$text = @end((explode('_', '233718_This_is_a_string', 2)));

โดยการระบุ2สำหรับlimitพารามิเตอร์ในexplode()ก็จะส่งกลับอาร์เรย์มี 2 องค์ประกอบสูงสุดคั่นด้วยตัวคั่นสตริง การคืนค่าองค์ประกอบที่ 2 ( [1]) จะให้สตริงที่เหลือ


นี่คืออีกหนึ่งซับโดยใช้strpos(ตามที่แนะนำโดย@flu ):

$needle = '233718_This_is_a_string';
$text = substr($needle, (strpos($needle, '_') ?: -1) + 1); // Returns This_is_a_string

2

หากใครต้องการแยกส่วนแรกของสตริงก็สามารถลองได้

ค้นหา:

$s = "This_is_a_string_233718";

$text = $s."_".substr($s, 0, strrpos($s, "_"));

เอาท์พุท:

This_is_a_string



1
$string = "233718_This_is_a_string";
$withCharacter = strstr($string, '_'); // "_This_is_a_string"
echo substr($withCharacter, 1); // "This_is_a_string"

ในงบเดียวมันจะเป็น

echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"

0

ฉันใช้ strrchr () ตัวอย่างเช่นการค้นหาส่วนขยายของไฟล์ฉันใช้ฟังก์ชั่นนี้:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.