ใครรู้วิธีที่รวดเร็วมากในการแทนที่การเกิดขึ้นครั้งสุดท้ายของสตริงด้วยสายอักขระอื่นในสตริง?
ใครรู้วิธีที่รวดเร็วมากในการแทนที่การเกิดขึ้นครั้งสุดท้ายของสตริงด้วยสายอักขระอื่นในสตริง?
คำตอบ:
คุณสามารถใช้ฟังก์ชั่นนี้:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
ไม่ว่าอะไรจะเกิดขึ้น มันส่งคืนสตริงไม่ว่าจะเกิดอะไรขึ้น หากการแทนที่ไม่สามารถทำได้จะส่งคืนต้นฉบับ$subject
เหมือนsubstr_replace
และstr_replace
ทำได้
strpos — Find the position of the first occurrence of a substring in a string
- แก้ไข: ว้าว Php อัจฉริยะทำหน้าที่เรียกว่าstrpos
และstrrpos
? ขอบคุณ ....
อีก 1 ซับ แต่ไม่มี preg:
$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';
echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
$string = 'this is my world, not my world';
$find = 'world';
$replace = 'farm';
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
echo strrev($result); //output: this is my world, not my farm
โซลูชันที่มีขนาดกะทัดรัดต่อไปนี้ใช้การยืนยันแบบ lookahead ที่เป็นบวกของ PCREเพื่อให้ตรงกับการเกิด substring ที่น่าสนใจล่าสุดนั่นคือการเกิด substring ที่ไม่เกิดขึ้นตามมาด้วยเหตุการณ์อื่น ๆ ของ substring เดียวกัน ดังนั้นตัวอย่างเช่นแทนที่ด้วยlast 'fox'
'dog'
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
เอาท์พุท:
The quick brown fox, fox, fox jumps over the lazy dog!!!
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
คุณสามารถทำได้:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
ผลลัพธ์คือ 'Hello John';
ความนับถือ
rtrim
ไม่ได้ทำงานอย่างที่คุณคิด มันจะตัดจากจุดสิ้นสุดอักขระใด ๆ ที่มีอยู่ในสตริงการค้นหาตามลำดับใด ๆ (และเพิ่มการแทนที่เสมอ) เช่น "Hello word" -> "Hello John", "Hello lord" -> "Hello John", "Hello John", "Hello มอเตอร์ "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn "
สิ่งนี้จะได้ผล:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
อัปเดตเวอร์ชันย่อที่กระชับยิ่งขึ้นเล็กน้อย ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
เพียงหนึ่งบรรทัดของรหัส (ตอบช้า แต่มันก็คุ้มที่จะเพิ่ม):
$string = 'The quick brown fox jumps over the lazy dog';
$find_me = 'dog';
preg_replace('/'. $find_me .'$/', '', $string);
สิ้นสุด $ ระบุจุดสิ้นสุดของสตริง
นี่เป็นคำถามโบราณ แต่ทำไมทุกคนถึงมองเห็นโซลูชันที่ใช้ regexp ที่ง่ายที่สุด ปริมาณ regexp ปกติเป็นคนโลภ! หากคุณต้องการค้นหาอินสแตนซ์สุดท้ายของรูปแบบเพียงติด.*
ไว้ด้านหน้า นี่คือวิธี:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
สิ่งนี้จะแทนที่อินสแตนซ์สุดท้ายของ "จิ้งจอก" เป็น "DUCK" อย่างที่ควรจะเป็นและพิมพ์:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
นอกเหนือจากความผิดพลาดในรหัส Faruk Unal มีสิ่งที่ดีที่สุด ฟังก์ชั่นหนึ่งจะหลอกลวง
คุณสามารถใช้ strrpos () เพื่อค้นหาการแข่งขันครั้งสุดท้าย
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
เอาต์พุต: picture_0007.value
จดชวเลขสำหรับคำตอบที่ยอมรับ
function str_lreplace($search, $replace, $subject){
return is_numeric($pos=strrpos($subject,$search))?
substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}
รุ่นสั้น:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
ใช้ "$" ในการแสดงออก reg เพื่อให้ตรงกับจุดสิ้นสุดของสตริง
$string = 'The quick brown fox jumps over the lazy fox';
echo preg_replace('/fox$/', 'dog', $string);
//output
'The quick brown fox jumps over the lazy dog'
สำหรับผู้ที่สนใจ: ฉันได้เขียนฟังก์ชั่นที่ใช้ preg_match เพื่อให้คุณสามารถแทนที่จากด้านขวาโดยใช้ regex
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
$lastMatch = end($matches);
if ($lastMatch && false !== $pos = strrpos($subject, $lastMatchedStr = $lastMatch[0])) {
$subject = substr_replace($subject, $replace, $pos, strlen($lastMatchedStr));
}
return $subject;
}
หรือเป็นการผสมผสาน / การใช้งานของทั้งสองตัวเลือก:
function str_rreplace($search, $replace, $subject) {
return (false !== $pos = strrpos($subject, $search)) ?
substr_replace($subject, $replace, $pos, strlen($search)) : $subject;
}
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
return ($lastMatch = end($matches)) ? str_rreplace($lastMatch[0], $replace, $subject) : $subject;
}
อ้างอิงจากhttps://stackoverflow.com/a/3835653/3017716และhttps://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้