পিএইচপি স্ট্রিং অন্য স্ট্রিংয়ের সাথে শেষ হয় কিনা তার সর্বাধিক দক্ষ পরীক্ষা কোনটি?


125

স্ট্রিংয়ের $strসাথে স্ট্রিংটি শেষ হয় কিনা তা পরীক্ষা করার স্ট্যান্ডার্ড পিএইচপি উপায় $test:

$endsWith = substr( $str, -strlen( $test ) ) == $test

এটি কি সবচেয়ে দ্রুততম উপায়?



এই স্ট্যান্ডলোন লাইব্রেরিতে যেমন পাওয়া যায় আপনি তা খুঁজে পেতে s($str)->endsWith($test)বা s($str)->endsWithIgnoreCase($test)সহায়ক হতে পারেন ।
কাওয়

উত্তর:


152

আসফ যা বলেছেন তা সঠিক। ঠিক এটি করতে পিএইচপি-তে একটি বিল্ট ইন ফাংশন রয়েছে।

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

যদি $testচেয়ে দীর্ঘতর হয় $strসতর্ক হবে, তাই আপনি যদি প্রথম যে জন্য চেক করতে হবে পিএইচপি।

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}

খুশী হলাম। এটি আসফের তুলনায় স্থানের তুলনা সাবস্ট্রাস্টারের () থেকে দ্রুত হবে বলে মনে হচ্ছে।
জেসন কোহেন

2
এমক্রামলির উত্তরটি দুর্দান্ত, তবে এটি '==' এর পরিবর্তে '===' ব্যবহার করা উচিত। '===' আরও কঠোর এবং সাধারণত আপনি যা চান তা করেন, যখন '==' বাজে আশ্চর্য হতে পারে। এমক্রামলির তৃতীয় কোড স্নিপেট সঠিক, তবে প্রথম দুটিটি নয়। substr_compare () কিছু ত্রুটির ক্ষেত্রে মিথ্যা প্রদান করে। পিএইচপি-তে, মিথ্যা == 0, যাতে কোড স্নিপেটগুলি সঙ্কেত দেয় যে স্ট্রিংটি পাওয়া গেছে found === এর সাথে, এটি ঘটে না।
জ্যাকসাহ্নওয়াল্ড্ট মনিকা

1
আমি আজ একটি বাগে চলে এসেছি যা আপনি পিএইচপি 5.5.11 এবং এর পরে প্রদত্ত সমাধানটি ভেঙে দেবেন। bugs.php.net/bug.php?id=67043
ব্যবহারকারী 2180613

3 ফাংশন কল ওভারহেড এটি দ্রুততম করে না।
থানহ ট্রুং

66

এই পদ্ধতিটি একটি সামান্য বিট মেমরি ব্যয়বহুল, তবে এটি দ্রুত:

stripos(strrev($haystack), $reversed_needle) === 0;

আপনি যখন সূচকে ঠিক কী তা জানেন তখন এটি সবচেয়ে ভাল, তাই আপনি এটি হার্ড-কোড করতে পারেন vers আপনি যদি প্রোগ্রামটিকে সুচটি উল্টে দেন তবে এটি আগের পদ্ধতির চেয়ে ধীর হয়ে যায়।


2
-1 আমি গুরুতরভাবে সন্দেহ করি যে এটি দ্রুত, এবং এটি কৌতুকপূর্ণ (শীতল তবে সাধারণত সহায়ক নয়)। খড়ের খড়ি যদি সুই দিয়ে শেষ নাstripos হয় তবে সবচেয়ে খারাপ ক্ষেত্রে পুরো স্ট্রিংটি পুনরাবৃত্তি substr_compareকরবে যেখানে সূচির বেশিরভাগ দৈর্ঘ্যের তুলনা করা হবে। হ্যাঁ, substr_compareখড়ের গাদা (এবং অনেক ছোট সুই) দৈর্ঘ্য গণক প্রয়োজন, কিন্তু এই পদ্ধতি প্রয়োজন যে এবং পূর্ণ তা কপি, এবং সম্ভবত বুট করার ছোট হাতের মধ্যে সমগ্র জিনিস রূপান্তর।
ডেভিড হার্কনেস

শীতল পদ্ধতির তবে অনেক ক্ষেত্রে অদক্ষ (যেমন উত্তরে বর্ণিত হয়েছে)! এখনও অদ্ভুতভাবে সৃজনশীল হওয়ার এবং এটি প্রদর্শন করার জন্য একটি উত্সাহ যা আপনারা কখনও কল্পনাও করতে পারেন একই জিনিস করার আরও বেশি উপায় থাকতে পারে। চিয়ার্স!
Fr0zenFyr

1
আমি পরীক্ষিত এবং গৃহীত উত্তরের চেয়ে দ্রুত এই পদ্ধতিটি খুঁজে পাই। এমনকি খড়ের খড়ি এবং সূঁচ উভয়ই উড়ানের দিকে বিপরীত হলেও এটি দ্রুত is
শুমোপ

@ ডেভিড হারকনেস আপনার সন্দেহগুলি নিশ্চিত হয়েছে কিনা তা পরীক্ষা করে দেখেছেন?
নাথান

@ নাথান না, যেহেতু substr_compare()সুন্দরভাবে কাজ করে তাই বেঞ্চমার্কের পক্ষে সময় সাপেক্ষ নয় ।
ডেভিড হার্কনেস

61
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

নেতিবাচক অফসেট "স্ট্রিংয়ের শেষ থেকে গণনা শুরু করে"।


3
আইএমও এটি প্রদত্ত সমাধানগুলির মধ্যে অন্যতম সেরা
রোমান পডলিনভ

আমি পারলে +200। এখানে মূল অন্তর্দৃষ্টি হ'ল .ণাত্মক দৈর্ঘ্য ব্যবহার করা স্ট্রিংয়ের শেষ অংশটি পায়। আপনি উপ-দৈর্ঘ্যের সাথে সাবস্ট্রটার ব্যবহার করতে পারেন এবং পরীক্ষার বিপরীতে একটি == করতে পারেন। অন্য উত্তরগুলি দরিদ্র।
নিক

11

strposস্ট্রিংটি কোথায় পাওয়া উচিত সেখানে অফসেট দিয়ে একটি স্ট্রিং অন্যটির সাথে শেষ হয় কিনা তা যাচাই করার একটি সহজ উপায় :

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}

সোজা, এবং আমি মনে করি এটি পিএইচপি 4 এ কাজ করবে।


8

আপনি কোন ধরণের দক্ষতার বিষয়ে যত্নশীল তা নির্ভর করে।

সাবস্ট্রটার ব্যবহার থেকে অতিরিক্ত অনুলিপির কারণে আপনার সংস্করণটি আরও মেমরি ব্যবহার করে।

কোনও বিকল্প সংস্করণ অনুলিপিটি তৈরি না করে কেবল স্ট্রিংয়ের সর্বশেষ ঘটনার জন্য মূল স্ট্রিংটি অনুসন্ধান করতে পারে তবে আরও পরীক্ষার কারণে সম্ভবত ধীর হতে হবে।

সম্ভবত সবচেয়ে দক্ষ উপায় হ'ল স্ট্রিংয়ের শেষে (টেস্ট) অবস্থান থেকে লুপ চর-বাই-চারটি করা এবং তুলনা করা। এটিই আপনি যে তুলনাটি করতে পারেন আশা করতে পারেন তার ন্যূনতম পরিমাণ এবং সম্ভবত কোনও অতিরিক্ত মেমরি ব্যবহার করা হয়নি।



3

আমি আশা করি যে নীচের উত্তরগুলি কার্যকর এবং সহজও হতে পারে:

$content = "The main string to search";
$search = "search";
//For compare the begining string with case insensitive. 
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the begining string with case sensitive. 
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case insensitive. 
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case sensitive. 
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

2

এটি দ্রুত বা না তা জানেন না তবে একটি একক চরিত্রের পরীক্ষার জন্যও এই কাজগুলি:

(array_pop(str_split($string)) === $test) ? true : false;
($string[strlen($string)-1] === $test) ? true : false;
(strrev($string)[0] === $test) ? true : false;

1

নিয়মিত প্রকাশের মাধ্যমে এটি পরীক্ষা করার সহজ উপায় way

উদাহরণস্বরূপ প্রদত্ত মেলটি জিমেইল কিনা তা পরীক্ষা করে দেখুন:

echo (preg_match("/@gmail\.com$/","example-email@gmail.com"))?'true':'false';

0

আমি ভাবছি strrchr () এর মতো বিপরীত ফাংশনগুলি আপনাকে স্ট্রিংয়ের শেষের সাথে দ্রুততম ম্যাচটি করতে সহায়তা করবে।


0

এটি খাঁটি পিএইচপি, স্ট্রেন ব্যতীত বাহ্যিক ফাংশনগুলি কল না করে ।

function endsWith ($ends, $string)
{
    $strLength = strlen ($string);
    $endsLength = strlen ($ends);
    for ($i = 0; $i < $endsLength; $i++)
    {
        if ($string [$strLength - $i - 1] !== $ends [$i])
            return false;
    }
    return true;
}

0

একক-চর সূঁচ জন্য:

if (@strrev($haystack)[0] == $needle) {
   // yes, it ends...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.