পিএইচপি একটি স্ট্রিংয়ের একটি স্ট্রিংয়ের শেষ ঘটনাটি প্রতিস্থাপন করে?


145

স্ট্রিংয়ের শেষ ঘটনাটি স্ট্রিংয়ের সাথে অন্য স্ট্রিংয়ের সাথে প্রতিস্থাপন করার জন্য খুব দ্রুত উপায়টি কি কেউ জানেন?


এই স্ট্যান্ডলোন লাইব্রেরিতেs($str)->replaceLast($search, $replace) যেমন পাওয়া যায় আপনি তেমন সহায়ক হতে পারেন ।
কাওয়

উত্তর:


228

আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

function str_lreplace($search, $replace, $subject)
{
    $pos = strrpos($subject, $search);

    if($pos !== false)
    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }

    return $subject;
}

এটি এখনও যাই হোক না কেন সত্য ফিরে আসছিল। এটি হতে সংশোধন করার বিষয়টি বিবেচনা করুন: যদি ($ pos) {$ সাবজেক্ট = সাবস্ট্রাস্ট্রি-রিপ্লেস ($ বিষয়, $ প্রতিস্থাপন, $ পোজ, স্ট্রেন ($ অনুসন্ধান)); প্রত্যাবর্তন $ বিষয়; } অন্য {মিথ্যা প্রত্যাবর্তন; }
জাজি

4
@ জেসন এটি TRUEযাই হোক না কেন ফিরে আসবে না। এটি যাই হোক না কেন স্ট্রিং ফিরিয়ে দেয়। যদি কোনও প্রতিস্থাপন করা যায় না তবে এটি আসলটি ফিরিয়ে দেয় $subject, ঠিক তেমন করুন substr_replace এবং str_replaceকরুন।
মিশা

@ মিছা কি এই ক্ষেত্রে একই জিনিস নয়? আমি! Str_lreplace এর মতো কিছু করার চেষ্টা করছিলাম, কিন্তু যদি এটি মিথ্যা না ফেরায়, তবে এটি সত্য বলে বিবেচিত হবে, তাই না? যেভাবেই হোক না কেন, এটি আমাকে সাহায্য করেছিল এবং আমি এটির প্রশংসা করি। ধন্যবাদ।
জাজি

1
কিভাবে এই কাজ করতে পারেন? strpos — Find the position of the first occurrence of a substring in a string- সম্পাদনা: বাহ পিএইচপি প্রতিভা সত্যিই একটি ফাংশন বলা হয় strposএবং strrpos? ধন্যবাদ ....
ব্যারিবোনস 41

1
@Barry এই এক ক্ষেত্রে যেখানে পিএইচপি দোষ প্রাপ্য না :-) নাম দশক বয়সী উপর আদর্শানুযায়ী গঠন করা হয় strstr, strrstrপ্রমিত C লাইব্রেরির, যা একই ফাংশন আছে। (তবে তারা করেনি আছে নাম পরিবর্তন করতে?)
Alexis

30

অন্য 1-লাইনার তবে প্রাগ ছাড়াই:

$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer

3
FWIW, গৃহীত সমাধান এই সমাধানের চেয়ে প্রায় 35% দ্রুত।
জাস্টকার্টি

27
$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

আমার মতে সর্বোত্তম সমাধান এবং এখনও বুঝতে ইজিস।
ব্ল্যাকব্যাম

এটি কেন বিপরীত সমস্ত স্ট্রিংয়ের সাথে কাজ করে? নিয়মিত-এক্সপ্রেশন ব্যবহার করার সময় কিছু (আমি ধরে নিই) নির্দিষ্ট পারফরম্যান্স লাভ কী?
কামাফেদার

না এটি আসলে কর্মক্ষমতা হ্রাস করে তবে এটি কেবল কারণ আপনি কেবলমাত্র সর্বশেষ ঘটনাটি চান তাই আপনি অনুসন্ধানটিকে একটিতে সীমাবদ্ধ রেখে সবকিছু বিপরীত করে ফেলতে চান যদি আপনি প্রথমে চান তবে আপনাকে কোনও কিছুর বিপরীতে পড়তে হবে না
তোফান্ডেল

15

নিম্নলিখিত পরিবর্তে কমপ্যাক্ট সমাধান পিসিআর পজিটিভ লুহ্যাড অ্যাডেরেন্সটি ব্যবহার করে আগ্রহের সাবস্ট্রিংয়ের শেষ ঘটনাটির সাথে মিলিত হতে পারে, এটি হ'ল স্ট্রস্ট্রিংয়ের একটি ঘটনা যা একই স্ট্রিংয়ের অন্য কোনও ঘটনা অনুসরণ করে না। সুতরাং উদাহরণটি এর 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!!!

5
ধারণাটি ভাল, তবে কোডটি নয়। এটি অবশ্যই হবে:$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
রোমার

প্রকৃতপক্ষে, আমি পোস্ট করা কোডটি "শিয়াল" এর সমস্ত উদাহরণকে শেষেরটিকে "কুকুর" বাদ দিয়ে পরিবর্তিত করে, তবে আমরা যা চাই তা সম্পূর্ণ বিপরীত। আপনাকে প্রতিস্থাপনের জন্য ধন্যবাদ? = সাথে !? সমস্যা সমাধান করে।
জন সন্ডারসন

11

আপনি এটি করতে পারেন:

$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';

ফলাফল হ্যালো জন ';

শুভেচ্ছা সহ


4
এটি যতক্ষণ না কোনও পুনরাবৃত্তি অক্ষর না থাকে ততক্ষণ কাজ করে। আমার পরিস্থিতিতে আমি পৃষ্ঠার নম্বরটি সংরক্ষণাগারটির তারিখের বাইরে রেখে দিচ্ছি যাতে আমার "2015-12 / 2" থাকে এবং এটি "2015-1" হিসাবে শেষ হতে সমস্ত / এবং সমস্ত 2 নেবে।
মাইক

এটি কেবল তখনই কাজ করবে যদি অনুসন্ধান করা শেষ ঘটনাটি সর্বশেষ শব্দ এবং এর পরে কোনও অতিরিক্ত অক্ষর না থাকে।
আশ্চর্যজনক

এটি কাজ করে না কারণ rtrimআপনি যা ভাবেন সেভাবে আচরণ করে না। এটি অনুসন্ধানের পংক্তিতে যে কোনও অক্ষর যে কোনও ক্রমে (এবং সর্বদা প্রতিস্থাপন সংযোজন করা হবে) থেকে শেষ হয়ে যাবে, যেমন "হ্যালো শব্দ" -> "হ্যালো জন", "হ্যালো লর্ড" -> "হ্যালো জন", "হ্যালো মোটর "->" হ্যালো মোটজোহন "," হ্যালো ওয়ার্ল্ডি "->" হ্যালো ওয়ার্ল্ডিয়া জন "।
জেক

5

এটিও কাজ করবে:

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);
}

আমি কি এটা ভুল করছি? যদি তাই হয় তবে আমাকে :) এড়িয়ে যান :) || প্রতিধ্বনি str_lreplace ("x", "y", "এই এক্স বা যে এক্স"); => আউটপুট: "y" দেখুন: ideone.com/UXuTo
এডোরিয়ান

@ এডোরিয়ান: উফ! দুঃখিত, আমি পোস্ট করেছি যে তাড়াহুড়োয়, সঠিক সংস্করণটি এখানে: আদর্শ one.com/vR073
অ্যালিক্স এক্সেল 18

5

কোডের কেবল একটি লাইন (দেরিতে উত্তর তবে এটি যুক্ত করা ভাল):

$string = 'The quick brown fox jumps over the lazy dog';
$find_me = 'dog';

preg_replace('/'. $find_me .'$/', '', $string);

শেষ $ স্ট্রিংয়ের সমাপ্তি নির্দেশ করে।


5

এটি একটি প্রাচীন প্রশ্ন, তবে সবাই কেন সহজ সরল রেজিএক্সএক্স-ভিত্তিক সমাধানটি উপেক্ষা করছেন? সাধারণ রেজিএক্সপ্যাক কোয়ান্টিফায়ার লোভী মানুষ! আপনি যদি কোনও প্যাটার্নের শেষ উদাহরণটি সন্ধান করতে চান তবে কেবল .*এর সামনে আটকে দিন। এখানে কীভাবে:

$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.

1
ধন্যবাদ! এটি সম্পাদন করার জন্য আমার অভিব্যক্তিটি চারপাশে মোড়ানোর উপযুক্ত ফাংশন। আমার ক্ষেত্রে আমি শেষ কমাটি ", এবং" দিয়ে প্রতিস্থাপন করছি। খুশী আমি এই উত্তর তালিকায় কিছুটা স্ক্রোল করেছি।
rlhane

3
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

কোডটিতে থাকা ভুলগুলি ছাড়াও ফারুক উনালের সেরা অ্যা্যানসার রয়েছে। একটি ফাংশন কৌশল করে।


আপনার চেক করা দরকার, যদি $ findChar মিথ্যা না হয় (গ্রহণযোগ্য উত্তরের মতোই)। যদি স্ট্রিংটিতে অনুসন্ধানের স্ট্রিং না থাকে তবে আপনি বিজ্ঞপ্তিটি পাবেন এবং প্রথম অক্ষরটি প্রতিস্থাপন করা হবে।
শেগি

এটি দুর্দান্ত, তবে এটি যেমন দাঁড়ায় এটি কেবলমাত্র 1 অক্ষরকে 1 অক্ষর প্রতিস্থাপন করতে পারে।
পিট

3

আপনি সর্বশেষ ম্যাচটি খুঁজে পেতে strrpos () ব্যবহার করতে পারেন।

$string = "picture_0007_value";
$findChar =strrpos($string,"_");

$string[$findChar]=".";

echo $string;

আউটপুট: ছবি_0007. মূল্য


2

স্বীকৃত উত্তরের জন্য শর্টহ্যান্ড

function str_lreplace($search, $replace, $subject){ 
    return is_numeric($pos=strrpos($subject,$search))?
    substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}


0

স্ট্রিংয়ের শেষের সাথে ম্যাচ করতে একটি রেগ এক্সপ্রেশনে "$" ব্যবহার করুন

$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'

4
এটি কেবল তখনই কাজ করে যদি সর্বশেষ ঘটনাটি স্ট্রিংয়ের শেষের দিকে হয় আদর্শিক.এনবিএনএসএনকিউ
কাউকেয়

1
শেষ 'শিয়ালের' পরে অন্য কোনও অক্ষর উপস্থিত হলে এটি কাজ করবে না।
জন সন্ডারসন

0

আগ্রহীদের জন্য: আমি এমন একটি ফাংশন লিখেছি যা প্রেগ_ম্যাচ ব্যবহার করে যাতে আপনি ডান হাত থেকে রেজেক্স ব্যবহার করে প্রতিস্থাপন করতে সক্ষম হন।

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 এর উপর ভিত্তি করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.