স্ট্রিংয়ের শুরু থেকে একটি স্ট্রিং সরান


146

আমার কাছে একটি স্ট্রিং রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

$str = "bla_string_bla_bla_bla";

আমি প্রথমটি কীভাবে সরিয়ে ফেলব bla_; তবে কেবল স্ট্রিংয়ের শুরুতে যদি এটি পাওয়া যায়?

সঙ্গে str_replace(), সরিয়ে ফেলা হবে সব bla_ 'র।


1
এই স্ট্যান্ডলোন লাইব্রেরিতেs($str)->replacePrefix('_bla') যেমন পাওয়া যায় আপনি তেমন সহায়ক হতে পারেন ।
কাওয়

উত্তর:


339

রিজেক্স ছাড়াই সরল রূপ:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';

if (substr($str, 0, strlen($prefix)) == $prefix) {
    $str = substr($str, strlen($prefix));
} 

লাগে: 0.0369 এমএস (0.000,036,954 সেকেন্ড)

এবং সাথে:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);

নেয়: 0.1749 এমএস (0.000,174,999 সেকেন্ড) 1 ম রান (সংকলন), এবং 0.0510 এমএস (0.000,051,021 সেকেন্ড) এর পরে।

আমার সার্ভারে প্রকাশিত, স্পষ্টতই।


8
আমি কখনই টার্নারি অপারেটরটিকে এত খারাপভাবে নির্যাতন করতে দেখিনি, একটি সাধারণ if(condition) { statement }এত পরিষ্কার হয়ে যেত।
তাতু উলমানেন

4
@ সালাথে: আমি সমালোচনা গ্রহণ করি। দ্রুততম কোনটি ছিল তা দেখার জন্য এটি একটি ব্যক্তিগত কৌতূহল ছিল।
ফ্যাবিও মোরা

51
@ সালাথে, আমি এটি পাই না। আইডোমেটিক এবং রেজেক্স ভিত্তিক উভয় সমাধান প্রস্তাব করা হয়েছিল: দক্ষতার দিক দিয়ে দুটির তুলনা করা সেরা (আবার দক্ষতার দিক দিয়ে) উত্তর খুঁজে পেতে সহায়তা করে। কেন সেই মন্দ?
cbrandolino

5
@ ক্যাব্রান্ডোলিনো, কেউই বলেননি যে এটি খারাপ ছিল । আমি কেবল এটি প্রশ্নের সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে করেছি; অনেকটা "এখানে দুটি সমাধান রয়েছে এবং এখানে আরও কিছু উত্সের জন্য কিছু বিড়ালছানাগুলির একটি চিত্র" থাকবে।
সালাতে

5
if (substr($str, 0, strlen($prefix)) == $prefix) if (0 === strpos($str, $prefix))একই পাঠযোগ্যতা বজায় রেখে অপ্রয়োজনীয় মেমরি বরাদ্দ এড়ানোর জন্য পরিবর্তন করা যেতে পারে :)
xDaizu

63

আপনি ক্যারেট প্রতীক ( ^) দিয়ে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন যা স্ট্রিংয়ের শুরুতে ম্যাচটি অ্যাঙ্কর করে:

$str = preg_replace('/^bla_/', '', $str);

আমি ভাবছি এটি substr()সংস্করণের চেয়ে দ্রুত কাজ করে ... আমার ধারণা এটি এটি করে, এবং যথাযথ উত্তর হিসাবে চিহ্নিত করা উচিত।
ফ্ল্যাশ থান্ডার

এটি বাদে অবশ্যই preg_quote'd
vp_arth

আমি মনে করি এটি কোনও প্রোগ্রামারের চোখের কাছে অনেক কম বেদনাদায়ক এবং আরও স্বজ্ঞাত। এমনকি যদি এটি অন্য প্রস্তাবিত সমাধানের (যা আমি সত্যিই সন্দেহ করি) কর্মক্ষমতা হারাতে পারি, তবুও আমি এটি পছন্দ করি।
Fr0zenFyr

multibyteদুঃস্বপ্ন অন্য সমাধানগুলির সাথে আরেকটি সমস্যা হ'ল যদি ফাইলটির এনকোডিংটি সঠিক হয় তবে এটি ভাল কাজ করে। যাইহোক, এটি এই প্রশ্নের ক্ষেত্রের মধ্যে থাকা উচিত নয় তাই আমি চিন্তা করি না।
Fr0zenFyr

বিষয়টি উল্লেখ করে ফিরে এসেছি যে এতে সাবজেক্ট স্ট্রিংগুলির একটি অ্যারে নিয়ে কাজ করার একটি অতিরিক্ত সুবিধা রয়েছে। substrএবং strposএকটি অ্যারে গ্রহণ করতে পারে না। আপনি যদি যান, আপনি যদি একটি অ্যারের সাথে ডিল করছেন তবে একটি নির্দিষ্ট পারফরম্যান্স লাভ। চিয়ার্স!
ফ্র0zenFyr

20
function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}

10
.''প্রয়োজন হয় না।
NateS

1
যেহেতু প্রতিটি এখানে মাইক্রো-অপ্টিমাইজিং বলে মনে হচ্ছে এটির জন্য এটি আমার গণনা অনুসারে ধারাবাহিকভাবে দ্রুত। 1 মিলিয়ন পুনরাবৃত্তি .17 সেকেন্ডে এসেছিল, তবে (substr($str, 0, strlen($prefix)) == $prefix)গ্রহণযোগ্য উত্তরটি এর চেয়ে বেশি ছিল
3737

5

এখানে.

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);

2
0.0000459153 সেকেন্ড পরিমাপ :)
ফ্যাবিও মোরা

দুর্দান্ত গতি, তবে এটি শেষ হওয়া সূঁচের উপর নির্ভর করতে কঠোর কোডিং _। একটি সাধারণ সংস্করণ আছে?
টুডমো

0

আমার মনে হয় সাবস্ট্রাস্টার-রিপ্লেসটি আপনি যা চান তা করেন, যেখানে আপনি আপনার প্রতিস্থাপনটিকে আপনার স্ট্রিংয়ের কিছু অংশে সীমাবদ্ধ করতে পারেন: http://nl3.php.net/manual/en/function.substr-replace.php (এটি আপনাকে কেবলমাত্র দেখার জন্য সক্ষম করবে) স্ট্রিং এর শুরু।)

আপনি আরআর_প্লেস ( http://nl3.php.net/manual/en/function.str-replace.php ) এর গণনা প্যারামিটার ব্যবহার করতে পারেন , এটি আপনাকে বাম থেকে শুরু করে প্রতিস্থাপনের সংখ্যা সীমাবদ্ধ করতে দেয়, তবে এটি এটি শুরুতে কার্যকর করা হবে না।


1
substr_replaceআপনি মুছে ফেলতে চান এমন উপসর্গ কিনা বা অন্য কিছু, নির্ধারিত রেঞ্জের অক্ষরগুলিকে প্রতিস্থাপন করবে। ওপি bla_"স্ট্রিংয়ের শুরুতে এটি পাওয়া গেলেই " সরাতে চায় ।
অলিভিয়ার 'balbaum' Scherler

0

দুর্দান্ত গতি, তবে এটি _ দিয়ে শেষ হওয়া সূঁচের উপর নির্ভর করে কঠোর কোডিং। একটি সাধারণ সংস্করণ আছে? - টুডমো জুন 29: 26 এ 29

একটি সাধারণ সংস্করণ:

$parts = explode($start, $full, 2);
if ($parts[0] === '') {
    $end = $parts[1];
} else {
    $fail = true;
}

কিছু মানদণ্ড:

<?php

$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';

$fail = false;

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    if (strpos($full, $start) === 0) {
        $end = substr($full, strlen($start));
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    $parts = explode($start, $full, 2);
    if ($parts[0] === '') {
        $end = $parts[1];
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);

আমার বেশ পুরানো হোম পিসিতে:

$ php bench.php

আউটপুট:

   strpos+strlen : 0.158388 s
         explode : 0.126772 s

0

এখানে আরও দ্রুত পদ্ধতির:

// strpos is faster than an unnecessary substr() and is built just for that 
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));

0

এটি যেখানে যেখানে পাওয়া যায় সেখানে প্রথম মিলটি সরিয়ে ফেলবে, যেমন শুরু বা মাঝখানে বা শেষ or

$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));


-6

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

এখন আপনি যা চান তা করে

$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);

7
str_replace()ফাংশনের $countপ্যারামিটার একটি পরিবর্তনশীল রেফারেন্স দ্বারা পাস প্রতিস্থাপন সংখ্যা খুঁজে পাওয়া হবে বলে আশা করা হয়, প্রতিস্থাপন সংখ্যা সীমিত নয়।
AL X X

-6

Www সরান। স্ট্রিংয়ের শুরু থেকে, এটি সবচেয়ে সহজ উপায় (এলটিআরএম)

$a="www.google.com";
echo ltrim($a, "www.");

8
দ্বিতীয় প্যারামিটারটি হ'ল স্ট্রিংয়ের বাম দিক থেকে সরানোর জন্য অক্ষরের মানচিত্র ( php.net/manual/function.ltrim.php )। অতএব: ltrim($a, "w.");ডোমেনটি "w" দিয়ে শুরু না হলেই কাজটি করা হবে। ltrim ('m.google.com', ".omg")ফলাফল le.com
খণ্ডিতযোগ্যতা

তবে এটি প্রশ্নের নির্দিষ্ট সমস্যাটি সমাধান করে, +1
চুলিয়ান

1
এটি সত্যই তার উত্তরটির জন্য নির্দিষ্ট সমস্যাটি সমাধান করে - প্রশ্নের সমস্যা নয়। এমনকি যদি আপনি সঙ্গে যান ltrim, এটি ভুলভাবে ব্যবহৃত হয়। দ্বিতীয় প্যারামিটারটি এমন অক্ষরের একটি তালিকা যা ছাঁটা উচিত; সুতরাং একটি একক "w."যথেষ্ট হবে।
টুকরো

আমি মনে করি, আইএমএইচও, এটি প্রশ্নের জন্য এবং সমস্যার জন্য সঠিক।
আব্রিম

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