পিএইচপি-তে আরম্ভের সাথে () এবং শেষের সাথে () ফাংশন


1478

আমি কীভাবে দুটি ফাংশন লিখতে পারি যা একটি স্ট্রিং নেয় এবং ফিরে আসে যদি তা নির্দিষ্ট অক্ষর / স্ট্রিং দিয়ে শুরু হয় বা এর সাথে শেষ হয়?

উদাহরণ স্বরূপ:

$str = '|apples}';

echo startsWith($str, '|'); //Returns true
echo endsWith($str, '}'); //Returns true

19
ভাল-পরীক্ষিত পদ্ধতির জন্য লারাভেলের স্টার ক্লাস শুরুগুলি সহ উইথ () এবং শেষগুলি সহ (দেখুন) দেখুন See এজ মামলাগুলির মুখোমুখি হয়েছিল, সুতরাং এই কোডটির ব্যাপক ব্যবহার একটি সুবিধা।
গ্রাস ডাবল

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

3
সতর্কতা: এখানে সর্বাধিক উত্তরগুলি ইউটিএফ -8 এর মতো মাল্টি-বাইট এনকোডিংগুলিতে অবিশ্বাস্য।
vlvaro González

আমার উপরের মন্তব্য অনুসরণ করে, আপনি সর্বশেষতম সংস্করণ (আজ হিসাবে 5.4 ) ব্যবহার নিশ্চিত করতে পারেন । উল্লেখযোগ্যভাবে, স্টার্টসইথ () বড় আকারের খড়ের স্ট্রিংয়ের জন্য অনুকূলিত হয়েছে।
গ্রাস ডাবল

উত্তর:


1611
function startsWith($haystack, $needle)
{
     $length = strlen($needle);
     return (substr($haystack, 0, $length) === $needle);
}

function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }

    return (substr($haystack, -$length) === $needle);
}

আপনি যদি একটি রেজেক্স ব্যবহার করতে না চান তবে এটি ব্যবহার করুন।


16
+1 এটি গৃহীত উত্তরের চেয়ে পরিষ্কার। এছাড়াও, $lengthশেষ লাইনে প্রয়োজন হয় না endsWith()
খুব বেশি পিএইচপি

13
আমি শেষ বলি ('foo', '') == মিথ্যা হ'ল সঠিক আচরণ। কারণ ফু কিছু শেষ করে না with 'ফু' 'ও', 'ও' এবং 'ফু' দিয়ে শেষ হয়।
মিঃ হুস

125
সমাপ্তিগুলিতে অনেক ছোট লেখা যেতে পারে:return substr($haystack, -strlen($needle))===$needle;
রোক ক্রালজ

12
আপনি এড়াতে পারেন ifক্ষণস্থায়ী দ্বারা পুরাপুরি $lengthতৃতীয় প্যারামিটার হিসাবে substr: return (substr($haystack, -$length, $length);। এটি $length == 0পুরোপুরি নয় খালি স্ট্রিং ফিরিয়ে দিয়ে কেস পরিচালনা করে $haystack
এমএক্সএক্সেকে

20
@ মিঃ হুস আমি মাল্টি-বাইট নিরাপদ ফাংশনগুলি ব্যবহার করার পরামর্শ দিচ্ছি, যেমন এমবি_স্ট্রেলেন এবং এমবি_সুবস্ট্র
১৯

1024

আপনি substr_compareস্টার্ট-উইথ এবং শেষটি পরীক্ষা করতে ফাংশনটি ব্যবহার করতে পারেন :

function startsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}
function endsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}

এটি পিএইচপি 7 ( বেঞ্চমার্ক স্ক্রিপ্ট ) এর দ্রুততম সমাধানগুলির মধ্যে একটি হওয়া উচিত । 8 কেবি খড়ের ছিদ্র, বিভিন্ন দৈর্ঘ্যের সূঁচ এবং পূর্ণ, আংশিক এবং কোনও মিলের কেসের বিরুদ্ধে পরীক্ষিত। strncmpশুরুর জন্য একটি স্পর্শ দ্রুত তবে এটি প্রান্তটি চেক করতে পারে না।


74
এই উত্তরটি এটি ডেইলি ডাব্লুটিএফ-তে পরিণত করেছে! : ডি দ্যডাইলিওটিএফ.ফার্টিকেলগুলি
উইম টেন ব্রিংক

দয়া করে মনে রাখবেন যে @ ডেভিডওয়ালাস এবং @ ফ্রেঞ্চসোএমএম মন্তব্যগুলি এই উত্তরের পুরানো সংস্করণে প্রযোজ্য। বর্তমান উত্তরটি ব্যবহার করে strrposযা সূচি খড়ের খোলার শুরুর সাথে মেলে না তা অবিলম্বে ব্যর্থ।
সালমান

2
আমি পাই না। Php.net/manual/en/function.strrpos.php এর উপর ভিত্তি করে : "যদি মানটি নেতিবাচক হয় তবে তার পরিবর্তে পিছনের দিকে অনুসন্ধান করে স্ট্রিংয়ের শেষে থেকে অনেকগুলি অক্ষর থেকে অনুসন্ধান শুরু হবে।" এটি ইঙ্গিত দেয় যে আমরা 0 টি অক্ষর (কারণ কারণে -strlength($haystack)) থেকে শুরু করছি এবং সেখান থেকে পিছনে সন্ধান করব ? এর অর্থ এই নয় যে আপনি কিছু অনুসন্ধান করছেন না? আমি এর !== falseঅংশগুলি বুঝতে পারি না । আমি অনুমান করছি যে এটি পিএইচপি-র এমন এক গণ্ডগোলের উপর নির্ভর করছে যেখানে কিছু মান "সত্যবাদী" এবং অন্যেরা "মিথ্যা" তবে এই ক্ষেত্রে কীভাবে এটি কাজ করে?
ওয়েলবোগ

3
@ ওয়েলবোগ: উদাহরণস্বরূপ খড়ের xxxyyyকাঁটা = সুই = yyyএবং strrposঅনুসন্ধানটি প্রথম থেকে শুরু করে x। এখন আমাদের এখানে সফল ম্যাচ নেই (y এর পরিবর্তে x পাওয়া গেছে) এবং আমরা আর পিছনে যেতে পারি না (আমরা স্ট্রিংয়ের শুরুতে আছি) তত্ক্ষণাত অনুসন্ধান ব্যর্থ হয় । ব্যবহার সম্পর্কে !== false- strrposউপরের উদাহরণে 0 বা মিথ্যা এবং অন্য মানটি আসবে না। তেমনি, strposউপরের উদাহরণে $tempপ্রত্যাশিত অবস্থান (প্রত্যাশিত অবস্থান) বা মিথ্যা ফিরে আসতে পারে। আমি সঙ্গে গিয়েছিলাম !== falseদৃঢ়তা জন্য কিন্তু আপনি ব্যবহার করতে পারে === 0এবং === $tempযথাক্রমে ফাংশন হবে।
সালমান

8
@ স্পো এটি ইতিমধ্যে প্রতিষ্ঠিত হয়েছে যে খড়ের কাঁটা বড় এবং সূঁচ না থাকলে strpos === 0 একটি ভয়াবহ সমাধান a
সালমান এ

243

23-অগস্ট -2016 আপডেট হয়েছে

ক্রিয়াকলাপ

function substr_startswith($haystack, $needle) {
    return substr($haystack, 0, strlen($needle)) === $needle;
}

function preg_match_startswith($haystack, $needle) {
    return preg_match('~' . preg_quote($needle, '~') . '~A', $haystack) > 0;
}

function substr_compare_startswith($haystack, $needle) {
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}

function strpos_startswith($haystack, $needle) {
    return strpos($haystack, $needle) === 0;
}

function strncmp_startswith($haystack, $needle) {
    return strncmp($haystack, $needle, strlen($needle)) === 0;
}

function strncmp_startswith2($haystack, $needle) {
    return $haystack[0] === $needle[0]
        ? strncmp($haystack, $needle, strlen($needle)) === 0
        : false;
}

টেস্ট

echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
    if($i % 2500 === 0) echo '.';
    $test_cases[] = [
        random_bytes(random_int(1, 7000)),
        random_bytes(random_int(1, 3000)),
    ];
}
echo "done!\n";


$functions = ['substr_startswith', 'preg_match_startswith', 'substr_compare_startswith', 'strpos_startswith', 'strncmp_startswith', 'strncmp_startswith2'];
$results = [];

foreach($functions as $func) {
    $start = microtime(true);
    foreach($test_cases as $tc) {
        $func(...$tc);
    }
    $results[$func] = (microtime(true) - $start) * 1000;
}

asort($results);

foreach($results as $func => $time) {
    echo "$func: " . number_format($time, 1) . " ms\n";
}

ফলাফল (পিএইচপি 7.0.9)

(সবচেয়ে ধীরে ধীরে সাজানো)

strncmp_startswith2: 40.2 ms
strncmp_startswith: 42.9 ms
substr_compare_startswith: 44.5 ms
substr_startswith: 48.4 ms
strpos_startswith: 138.7 ms
preg_match_startswith: 13,152.4 ms

ফলাফল (পিএইচপি 5.3.29)

(সবচেয়ে ধীরে ধীরে সাজানো)

strncmp_startswith2: 477.9 ms
strpos_startswith: 522.1 ms
strncmp_startswith: 617.1 ms
substr_compare_startswith: 706.7 ms
substr_startswith: 756.8 ms
preg_match_startswith: 10,200.0 ms

startswith_benchmark.php


3
যদি আপনার পরীক্ষাগুলির মতো স্ট্রিংগুলি খালি না থাকে তবে এটি আসলে কোনওরকম (20-30%) দ্রুত: function startswith5b($haystack, $needle) {return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;}আমি নীচে একটি উত্তর যুক্ত করেছি।
ফ্রান্সেসকোএমএম

3
@ জ্রোনি কারণ ১১০ টি 133 এর চেয়ে কম ... ??
এমপেন

2
ডার্ন, আমার মাথায় my সময় কী গেল আমি জানি না। প্রলির ঘুমের অভাব।
জ্রোনি

1
@ স্পেন, আমি হাতিটির মোটেও খেয়াল করিনি :(
'15

1
এই পরীক্ষাগুলি পারফরম্যান্স পরীক্ষায় ভাল নয়। আপনি যা করছেন তা সুই হিসাবে এলোমেলো স্ট্রিং ব্যবহার করছে। 99.99% ক্ষেত্রে কোনও মিল নেই। বেশিরভাগ ফাংশন প্রথম বাইটের সাথে মিলে যাওয়ার পরে প্রস্থান করবে। কোনও ম্যাচ পাওয়া গেলে মামলার বিষয়ে কী বলা যায়? সফল ম্যাচটি শেষ করতে কোন ফাংশনে কম সময় লাগে? 99% সূচ মিলছে তবে শেষ কয়েকটি বাইটের ক্ষেত্রে কী হবে? কোন ফাংশন কোনও ম্যাচ শেষ করতে কমপক্ষে সময় নেয়?
সালমান এ

137

সকল উত্তর এতদূর অপ্রয়োজনীয় কাজ লোড করতে মনে strlen calculations, string allocations (substr)ইত্যাদি দ্য 'strpos'এবং 'stripos'ফাংশন প্রথম ঘটনার সূচক আসতে $needleমধ্যে $haystack:

function startsWith($haystack,$needle,$case=true)
{
    if ($case)
        return strpos($haystack, $needle, 0) === 0;

    return stripos($haystack, $needle, 0) === 0;
}

function endsWith($haystack,$needle,$case=true)
{
    $expectedPosition = strlen($haystack) - strlen($needle);

    if ($case)
        return strrpos($haystack, $needle, 0) === $expectedPosition;

    return strripos($haystack, $needle, 0) === $expectedPosition;
}

2
endsWith()ফাংশন একটি ত্রুটি আছে। এর প্রথম লাইনটি (-1 ছাড়াই) হওয়া উচিত: $expectedPosition = strlen($haystack) - strlen($needle);
এনরিকো ডিটোমা

6
স্ট্রেন () জিনিসটি অপ্রয়োজনীয় নয়। যদি স্ট্রিং প্রদত্ত সূঁচ দিয়ে শুরু না হয় তবে আপনার কোডটি অযথা পুরো খড়ের কাঁটা স্ক্যান করবে।
অ্যাপলগ্রু

5
@ মারক হ্যাঁ, কেবল শুরুটি পরীক্ষা করা খুব দ্রুততর কাজ, বিশেষত যদি আপনি মাইমে টাইপগুলি (বা স্ট্রিংটি বড় হতে বাধ্য এমন অন্য কোনও জায়গায়) যাচাই করার মতো কিছু করছেন
ছাচাম 15

2
@ চিহ্ন আমি 1000 চর খড়ের ছোপ এবং 10 বা 800 চর সূঁচ এবং স্ট্রপোস সহ 30% দ্রুত ছিল some কিছু দ্রুত বা না তা উল্লেখ করার আগে আপনার
মানদণ্ডগুলি করুন

7
আপনার সূঁচের উদ্ধৃতিটি দৃ strongly়তার সাথে বিবেচনা করা উচিত যেমন strpos($haystack, "$needle", 0)যদি এর কোনও সম্ভাবনা থাকে তবে এটি ইতিমধ্যে স্ট্রিং নয় (যেমন, যদি এটি আসছে json_decode())। অন্যথায়, [বিজোড়] এর ডিফল্ট আচরণটি strpos()অপ্রত্যাশিত ফলাফলের কারণ হতে পারে: " যদি
সূচটি

46
function startsWith($haystack, $needle, $case = true) {
    if ($case) {
        return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
    }
    return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
}

function endsWith($haystack, $needle, $case = true) {
    if ($case) {
        return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
    }
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
}

ক্রেডিট :

স্ট্রিংটি অন্য স্ট্রিংয়ের সাথে শেষ হচ্ছে কিনা তা পরীক্ষা করুন

স্ট্রিংটি অন্য স্ট্রিং দিয়ে শুরু হয় কিনা তা পরীক্ষা করুন


1
সংবেদনশীল ফাংশনগুলি তৈরি করার জন্য স্ট্র্টলওয়ার সবচেয়ে ভাল উপায় নয়। কিছু লোকালে কেসিং কেবল ওপরের এবং নীচের চেয়ে জটিল।
স্যান্ডার রিজকেন

8
আমি অভিযোগ করছি এবং এর সমাধান নেই you're
কেডিজিদেভ

2
@ ওয়েবদেবহোব: এজন্য আপনার মন্তব্যের একদিন আগে আমি নিজেই একটি উত্তর যুক্ত করেছি। আপনার কোড স্টারকেসক্যাম্পের জন্য সত্যই সঠিক জিনিস ছিল।
স্যান্ডার রিজকেন

29

রেজেক্স উপরে কাজ করে, তবে অন্যান্য টুইটগুলির সাথে উপরেও প্রস্তাবিত:

 function startsWith($needle, $haystack) {
     return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack);
 }

 function endsWith($needle, $haystack) {
     return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
 }

2
পিএইচপি-তে স্ট্রিং অপারেশনের জন্য প্যারামিটারগুলির ক্রম হ'ল $ খড়ের ছাঁচ,। সুই। এই ফাংশনগুলি পিছনের দিকে থাকে এবং অ্যারে ফাংশনগুলির মতো কাজ করে যেখানে ক্রমটি অর্ডার করা আসলে $ সূঁচ, y খড়ের ছিদ্র।
অ্যান্ডি

29

এই প্রশ্নের ইতিমধ্যে অনেক উত্তর রয়েছে, তবে কিছু ক্ষেত্রে আপনি এগুলির সবকটির চেয়ে সহজ কিছু জন্য স্থির করতে পারেন। আপনি যে স্ট্রিংটির সন্ধান করছেন তা যদি জানা থাকে (হার্ডকোডযুক্ত), আপনি কোনও উদ্ধৃতি ইত্যাদি ছাড়াই নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন you

স্ট্রিংটি 'এবিসি' দিয়ে শুরু হয় কিনা তা পরীক্ষা করুন:

preg_match('/^ABC/', $myString); // "^" here means beginning of string

'এবিসি' দিয়ে শেষ:

preg_match('/ABC$/', $myString); // "$" here means end of string

আমার সাধারণ ক্ষেত্রে, আমি পরীক্ষা করতে চেয়েছিলাম যে স্ট্র্যাশটি স্ল্যাশের সাথে শেষ হয়েছে কিনা:

preg_match('#/$#', $myPath);   // Use "#" as delimiter instead of escaping slash

সুবিধা: যেহেতু এটি খুব সংক্ষিপ্ত এবং সহজ, আপনার endsWith()উপরে কোনও ফাংশন (যেমন ) সংজ্ঞায়িত করতে হবে না ।

তবে আবার - এটি প্রতিটি ক্ষেত্রেই কোনও সমাধান নয়, কেবল এটি অত্যন্ত নির্দিষ্ট।


আপনার স্ট্রিংটি হার্ড কোড করার দরকার নেই। রেজেক্স গতিশীল হতে পারে।
রায়ান

2
@ নিজেই সত্য, তবে যদি স্ট্রিংটি হার্ডকোডযুক্ত না হয় তবে আপনাকে এড়াতে হবে। বর্তমানে এই প্রশ্নের 2 টি উত্তর রয়েছে যা এটি করে। এটি সহজ, তবে কোডটি কিছুটা জটিল করে তোলে। সুতরাং আমার বক্তব্যটি ছিল খুব সাধারণ ক্ষেত্রে, যেখানে হার্ডকোডিং সম্ভব, আপনি এটি সহজ রাখতে পারেন।
noamtm

1
আপনারও স্ল্যাশ থেকে বাঁচতে হবে না, আপনি অন্য কোনও চরিত্রের মধ্যে রেজেক্স মোড়তে পারেন, যেমন @, যাতে স্ল্যাশ ( /) এড়াতে হবে না । উদাহরণ # 3 এখানে দেখুন: php.net/manual/en/function.preg-match.php
সিজেবার্থ

ধন্যবাদ @ সিজেবার্থ। আমার উত্তর অনুসারে পরিবর্তন। বিটিডাব্লু, "#" হ'ল একটি স্ল্যাশ নিয়ে কাজ করার সময় php.net/manual/en/regexp.references.delimiters.php এ দেওয়া উদাহরণ ।
noamtm

23

যদি গতি আপনার জন্য গুরুত্বপূর্ণ হয় তবে এটি চেষ্টা করে দেখুন ((আমি বিশ্বাস করি এটি দ্রুততম পদ্ধতি)

কেবল স্ট্রিংয়ের জন্য এবং যদি $ খড়ের খালি মাত্র 1 টি চরিত্রের জন্য কাজ করে

function startsWithChar($needle, $haystack)
{
   return ($needle[0] === $haystack);
}

function endsWithChar($needle, $haystack)
{
   return ($needle[strlen($needle) - 1] === $haystack);
}

$str='|apples}';
echo startsWithChar($str,'|'); //Returns true
echo endsWithChar($str,'}'); //Returns true
echo startsWithChar($str,'='); //Returns false
echo endsWithChar($str,'#'); //Returns false

1
এটি সম্ভবত সবচেয়ে দক্ষ উত্তর কারণ কোনও ফাংশন অতিরিক্ত, কেবল স্বাভাবিক স্ট্রিং হিসাবে ব্যবহার না করা ...

সম্ভবত স্ট্রিংয়ের কমপক্ষে একটি অক্ষর রয়েছে এবং দুটি প্যারামিটারটি অদলবদল হয়েছে কিনা তা পরীক্ষা করা উচিত
a1an

1
ক্রিয়েটিভ। সূঁচ যা খড়ের ছিটে থাকে। বিটিডব্লিউ এখানে কিছু কুৎসিতভাবে নিখোঁজ রয়েছে: endsWithChar('','x')তবে ফলাফলটি সঠিক
টিনো

18

এখানে দুটি ফাংশন রয়েছে যা অস্থায়ী স্ট্রিংটি প্রবর্তন করে না, যা সূঁচগুলি যথেষ্ট পরিমাণে বড় হলে কার্যকর হতে পারে:

function startsWith($haystack, $needle)
{
    return strncmp($haystack, $needle, strlen($needle)) === 0;
}

function endsWith($haystack, $needle)
{
    return $needle === '' || substr_compare($haystack, $needle, -strlen($needle)) === 0;
}

2
+1 PHP5.1 এবং IMHO সেরা উত্তর থেকে কাজ করে best তবে করা endsWidthউচিত return $needle==='' || substr_compare(... সুতরাং এটি প্রত্যাশার মতো কাজ করে -strlen($needle)===0যার জন্য ঠিক না করেই endsWith('a','')ফিরতে পারেfalse
টিনো

@ টিনো ধন্যবাদ ... আমি মনে করি এটি substr_compare()আসলে একটি ত্রুটি , তাই আমি এটি ঠিক করার জন্য একটি পিআর যুক্ত করেছি :)
জ্যাক

3
কলটি endsWith('', 'foo')একটি সতর্কতা ট্রিগার করে: "সাবস্ট্রাকোম্পার (): শুরুর অবস্থানটি প্রাথমিক স্ট্রিংয়ের দৈর্ঘ্য অতিক্রম করতে পারে না"। হতে পারে এটি অন্য কোনও বাগ substr_compare(), তবে এড়াতে আপনার প্রাক-চেকের মতো দরকার ... || (strlen($needle) <= strlen($haystack) && substr_compare(...) === 0);
gx_

@gx_ আরও কোড সহ ধীর হওয়ার প্রয়োজন নেই। return $needle === '' || @substr_compare(এই সতর্কতাটি দমন করতে কেবল .. ব্যবহার করুন ।
টিনো 11

17

দ্রুততম সমাপ্তি () সমাধানের সাথে:

# Checks if a string ends in a string
function endsWith($haystack, $needle) {
    return substr($haystack,-strlen($needle))===$needle;
}

মাপকাঠি:

# This answer
function endsWith($haystack, $needle) {
    return substr($haystack,-strlen($needle))===$needle;
}

# Accepted answer
function endsWith2($haystack, $needle) {
    $length = strlen($needle);

    return $length === 0 ||
    (substr($haystack, -$length) === $needle);
}

# Second most-voted answer
function endsWith3($haystack, $needle) {
    // search forward starting from end minus needle length characters
    if ($needle === '') {
        return true;
    }
    $diff = \strlen($haystack) - \strlen($needle);
    return $diff >= 0 && strpos($haystack, $needle, $diff) !== false;
}

# Regex answer
function endsWith4($haystack, $needle) {
    return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
}

function timedebug() {
    $test = 10000000;

    $time1 = microtime(true);
    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith('TestShortcode', 'Shortcode');
    }
    $time2 = microtime(true);
    $result1 = $time2 - $time1;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith2('TestShortcode', 'Shortcode');
    }
    $time3 = microtime(true);
    $result2 = $time3 - $time2;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith3('TestShortcode', 'Shortcode');
    }
    $time4 = microtime(true);
    $result3 = $time4 - $time3;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith4('TestShortcode', 'Shortcode');
    }
    $time5 = microtime(true);
    $result4 = $time5 - $time4;

    echo $test.'x endsWith: '.$result1.' seconds # This answer<br>';
    echo $test.'x endsWith2: '.$result4.' seconds # Accepted answer<br>';
    echo $test.'x endsWith3: '.$result2.' seconds # Second most voted answer<br>';
    echo $test.'x endsWith4: '.$result3.' seconds # Regex answer<br>';
    exit;
}
timedebug();

বেঞ্চমার্ক ফলাফল:

10000000x endsWith: 1.5760900974274 seconds # This answer
10000000x endsWith2: 3.7102129459381 seconds # Accepted answer
10000000x endsWith3: 1.8731069564819 seconds # Second most voted answer
10000000x endsWith4: 2.1521229743958 seconds # Regex answer

3
বিভিন্ন সমাধানের তুলনা করতে সময় দেওয়ার জন্য +1 এবং আসলে সেগুলি বেনমার্ক করুন! ভাষাটি বিকশিত হওয়ার সাথে সাথে অপ্টিমাইজেশানগুলি করা হিসাবে আপনি কী পিএইচপি ব্যবহার করেছেন সেটির কোনও সংস্করণও উল্লেখ করা উচিত! আমি এক পিএইচপি সংস্করণ থেকে অন্যটিতে স্ট্রিং তুলনা ফাংশনে নাটকীয় উন্নতি দেখেছি :)
ক্রিস্টোফ

1
ক্রিশ্ফেডেলিইনস এবং পিএইচপি সংস্করণ সরবরাহ করার জন্য তাঁর অনুরোধ প্রতিধ্বনিত হচ্ছে। আমি 7.3.2 এ আপনার পরীক্ষা চালিয়েছি এবং এফডাব্লুআইডাব্লু একই ফলাফল পেয়েছি।
জেফ

16

আমি বুঝতে পেরেছি যে এটি শেষ হয়ে গেছে, তবে আপনি স্ট্রিংয়ের দৈর্ঘ্যের তুলনা করার জন্য স্ট্রিংয়ের দৈর্ঘ্যটি সংযোজন করতে পারবেন বলে আপনি দেখতে চাইতে পারেন:

function startsWith($haystack, $needle, $case=true) {
    if ($case)
        return strncasecmp($haystack, $needle, strlen($needle)) == 0;
    else
        return strncmp($haystack, $needle, strlen($needle)) == 0;
}    

আপনি কিভাবে এই সঙ্গে শেষ করতে হবে?
এমপেন

@ মার্ক - আপনি গৃহীত উত্তরটি দেখতে পারেন তবে আমি নিরাপদ বলেই মূলত স্ট্র্যাম্প ব্যবহার করতে পছন্দ করি।
জেমস ব্ল্যাক

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

@ মার্ক - শেষের জন্য আমি কেবল স্ট্র্যাপপস ( php.net/manual/en/function.strrpos.php ) ব্যবহার করব তবে সাধারণত আপনি যে কোনও সময় আরআরসিএমপি স্ট্রিংসিএমপি ব্যবহার করতে পারেন সম্ভবত এটি একটি নিরাপদ বিকল্প।
জেমস ব্ল্যাক

11

আপনি ব্যবহার করতে পারেন strposএবংstrrpos

$bStartsWith = strpos($sHaystack, $sNeedle) == 0;
$bEndsWith = strrpos($sHaystack, $sNeedle) == strlen($sHaystack)-strlen($sNeedle);

1
আপনি এখানে ট্রিপল সমান ব্যবহার করা উচিত strpos($sHaystack, $sNeedle) == 0ভালো strpos($sHaystack, $sNeedle) === 0? আমি একটি বাগ দেখতে পাই, যখন false == 0মূল্যায়ন করি true
কল্যাণ

11

এখানে গৃহীত উত্তরের একটি মাল্টি-বাইট নিরাপদ সংস্করণ রয়েছে, এটি ইউটিএফ -8 স্ট্রিংয়ের জন্য সূক্ষ্মভাবে কাজ করে:

function startsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return (mb_substr($haystack, 0, $length, 'UTF-8') === $needle);
}

function endsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return $length === 0 ||
        (mb_substr($haystack, -$length, $length, 'UTF-8') === $needle);
}

2
আমি নিশ্চিত যে এটি কেবলমাত্র সিপিইউয়ের অপচয় waste স্টারস্টউইথ এবং এন্ডসভিথের জন্য আপনাকে যা যা পরীক্ষা করতে হবে তা কেবল বাইটের সাথে মিলছে কিনা তা খতিয়ে দেখছে এবং গ্রহণযোগ্য উত্তরটি ঠিক সেটাই করছে। এই 1 টি সুইয়ের utf8 টির সংখ্যা গণনা করার সময় নষ্ট করে এবং যেখানে খড়খড়ের n'th utf8 চরিত্রের অবস্থানটি .. আমি মনে করি, 100% নিশ্চিত না হয়ে এটি কেবল সিপিইউয়ের অপচয় waste আপনি কি আসল পরীক্ষার ক্ষেত্রে আসতে পারেন যেখানে গৃহীত উত্তরটি ব্যর্থ হয়, এবং এটি হয় না?
হাশেনেরিক

2
@হানশেরিক - এটি বিটিডব্লিউ ঘটতে পারে, যখন আপনি এমন স্ট্রিং সন্ধান করেন যেখানে কোনও ইউটিএফ 8 এর সমান বাইট থাকে তবে শেষ চরিত্রের অর্ধেক হারিয়ে যায়। যেমন, আপনার কাছে ইউনিকোড সি 5 91 (চিঠি "ő") রয়েছে এবং আপনি সি 5 (অক্ষর "Å") সন্ধান করছেন এটি আপনাকে কোনও মিল দেবে না। অন্যদিকে, নিশ্চিত, আপনি কেন একটি নন-ইউটিএফ সূঁচের জন্য ইউটিএফ খড়ের সন্ধান করবেন ... তবে বুলেটপ্রুফ চেকগুলির জন্য, এটি অবশ্যই একটি সম্ভাবনা হিসাবে বিবেচনা করা উচিত।
dkellner

ইন startsWithএটি হওয়া উচিত$length = mb_strlen($needle, 'UTF-8');
টমাস Kekeisen

2
থমাস কেকেইসেন ধন্যবাদ, এটি ঠিক করেছেন
ওয়াহিদ আমিরি

8

নিয়মিত প্রকাশ ছাড়াই সংক্ষিপ্ত এবং সহজে বোঝার জন্য এক-লাইনার।

প্রারম্ভের সাথে () সরাসরি এগিয়ে রয়েছে।

function startsWith($haystack, $needle) {
   return (strpos($haystack, $needle) === 0);
}

শেষের সাথে () সামান্য অভিনব এবং ধীর স্ট্রাইভ () ব্যবহার করে:

function endsWith($haystack, $needle) {
   return (strpos(strrev($haystack), strrev($needle)) === 0);
}

@ ফ্রেঞ্চসোএমএম: স্ট্রপোস "সঠিক সরঞ্জাম" নয় ... কেন? "সঠিক সরঞ্জাম" কি কি? সম্পাদনা: আমি নীচে আপনার উত্তর পড়ে। আমি ভেবেছিলাম প্রোগ্রামিং আপনার সংস্থানগুলি ব্যবহার করে আবিষ্কারের মতো .. সুতরাং কোনও সঠিক বা ভুল নেই ... কেবলমাত্র কাজ করা বা কাজ নয় ... সম্পাদনা গৌণ secondary
Fr0zenFyr

"কারণ এটি অনুসন্ধানের একটি সরঞ্জাম, তুলনা করার জন্য নয়?" সিআইটি। এরিস্টোটেলস
ফ্রান্সেসকোএমএম

7

শুরুতে মনোনিবেশ করা, আপনি যদি নিশ্চিত হন যে স্ট্রিংগুলি খালি নয়, তুলনা করার আগে স্ট্রেন ইত্যাদির আগে প্রথম চরে একটি পরীক্ষা যুক্ত করে জিনিসগুলিকে কিছুটা গতি বাড়িয়ে তোলে:

function startswith5b($haystack, $needle) {
    return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;
}

এটি একরকম (20% -30%) দ্রুত। Char হায়েস্ট্যাক {1} === $ সূঁচ {1 like এর মতো আরও একটি চর পরীক্ষা যুক্ত করা জিনিসগুলিকে বেশি গতিবেগ বলে মনে হয় না, এমনকি ধীর হতে পারে।

===দ্রুত বলে মনে হয় চেয়ে == শর্তসাপেক্ষ অপারেটর (a)?b:cযতো তাড়াতাড়ি বলে মনে হয়if(a) b; else c;


যারা জিজ্ঞাসা করছেন তাদের জন্য "স্ট্রপোস ব্যবহার করবেন না কেন?" অন্যান্য সমাধানকে "অপ্রয়োজনীয় কাজ" বলা


স্ট্রপোসগুলি দ্রুত, তবে এটি এই কাজের জন্য সঠিক সরঞ্জাম নয়।

বোঝার জন্য, এখানে উদাহরণ হিসাবে কিছুটা সিমুলেশন দেওয়া হল:

Search a12345678c inside bcdefga12345678xbbbbb.....bbbbba12345678c

কম্পিউটার "ভিতরে" কি করে?

    With strccmp, etc...

    is a===b? NO
    return false



    With strpos

    is a===b? NO -- iterating in haysack
    is a===c? NO
    is a===d? NO
    ....
    is a===g? NO
    is a===g? NO
    is a===a? YES
    is 1===1? YES -- iterating in needle
    is 2===3? YES
    is 4===4? YES
    ....
    is 8===8? YES
    is c===x? NO: oh God,
    is a===1? NO -- iterating in haysack again
    is a===2? NO
    is a===3? NO
    is a===4? NO
    ....
    is a===x? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    ...
    ... may many times...
    ...
    is a===b? NO
    is a===a? YES -- iterating in needle again
    is 1===1? YES
    is 2===3? YES
    is 4===4? YES
    is 8===8? YES
    is c===c? YES YES YES I have found the same string! yay!
    was it at position 0? NOPE
    What you mean NO? So the string I found is useless? YEs.
    Damn.
    return false

ধরে নেওয়া স্ট্রেন পুরো স্ট্রিংটিকে পুনরাবৃত্তি করে না (তবে সে ক্ষেত্রেও) এটি মোটেই সুবিধাজনক নয়।


প্রথম অক্ষরগুলি পৃথক হলে কেবল একটি গতি বাড়ানো হবে।
জ্যাক

2
@ জ্যাক হ্যাঁ, অবশ্যই, ধারণাটি এই যে পরিসংখ্যানগতভাবে এটি ঘটে, তাই স্পিডআপটি সাধারণভাবে পুরো পরীক্ষার সেটের তুলনায় 20% -30% হয় (যেখানে এটি পৃথক নয় এমন ক্ষেত্রেও রয়েছে)। যখন তারা আলাদা না হয় এবং খুব কম আলগা হয় তখন আপনি অনেক কিছু অর্জন করেন। গড়ে আপনি 30% লাভ করেন (সেট অনুসারে পরিবর্তিত হয় তবে বেশিরভাগ ক্ষেত্রে আপনি বড় পরীক্ষায় গতি অর্জন করেন)
ফ্রান্সেসকোএমএম

"তবে এটি এই কাজের জন্য সঠিক সরঞ্জাম নয়" ... কোনও প্রশংসা?
Fr0zenFyr

1
ডব্লিউটিএফ। আমি নীচের সমস্ত প্রক্রিয়াটি তালিকাবদ্ধ করেছি যার চেয়ে আরও বেশি কিছু উল্লেখ করা উচিত? মুষ্টির চরিত্রটি 'এ' নয় বলে আপনি কি কোনও স্ট্রিংয়ের শেষ অবধি অনুসন্ধান করে এমন কোনও ফাংশন ব্যবহার করবেন? কে এটা যত্ন করে? এটি সঠিক সরঞ্জাম নয় কারণ এটি অনুসন্ধানের একটি সরঞ্জাম, তুলনা করার জন্য নয়, সুস্পষ্টভাবে বর্ণনা করার জন্য অ্যারিস্টোটেলগুলি উদ্ধৃত করার প্রয়োজন নেই!
ফ্রান্সেসকোএমএম

6

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

$content = "The main string to search";
$search = "T";
//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';

6

আমি সাধারণত আজকাল আন্ডারস্কোর-পিএইচপি এর মতো লাইব্রেরি সহ শেষ করি ।

require_once("vendor/autoload.php"); //use if needed
use Underscore\Types\String; 

$str = "there is a string";
echo( String::startsWith($str, 'the') ); // 1
echo( String::endsWith($str, 'ring')); // 1   

গ্রন্থাগারটি অন্যান্য কার্যকর কাজগুলিতে পূর্ণ।


6

উত্তর দ্বারা mpen অবিশ্বাস্যভাবে পুঙ্খানুপুঙ্খ, কিন্তু, দুর্ভাগ্যবশত, প্রদান করা বেঞ্চমার্ক একটি খুব গুরুত্বপূর্ণ এবং ক্ষতিকারক ভুল হয়েছে।

যেহেতু সূঁচ এবং খড়ের প্রতিটি বাইট সম্পূর্ণরূপে এলোমেলো, একটি সূঁচ-খড়ের টুকরো জোড়া খুব প্রথম বাইটে পৃথক হওয়ার সম্ভাবনাটি 99.609375%, যার অর্থ, গড়ে 100000 জোড়ার প্রায় 99609 খুব প্রথম বাইটে পৃথক হবে । অন্য কথায়, মানদণ্ড startswithবাস্তবায়নের প্রতি ভারী পক্ষপাতদুষ্ট যা প্রথম বাইটকে স্পষ্টতই পরীক্ষা করে, যেমন asstrncmp_startswith2 করে।

পরিবর্তে যদি পরীক্ষার উত্পন্ন লুপটি প্রয়োগ করা হয়:

echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
    if($i % 2500 === 0) echo '.';

    $haystack_length = random_int(1, 7000);
    $haystack = random_bytes($haystack_length);

    $needle_length = random_int(1, 3000);
    $overlap_length = min(random_int(0, $needle_length), $haystack_length);
    $needle = ($needle_length > $overlap_length) ?
        substr($haystack, 0, $overlap_length) . random_bytes($needle_length - $overlap_length) :
        substr($haystack, 0, $needle_length);

    $test_cases[] = [$haystack, $needle];
}
echo " done!<br />";

মানদণ্ডের ফলাফলগুলি কিছুটা আলাদা গল্প বলে:

strncmp_startswith: 223.0 ms
substr_startswith: 228.0 ms
substr_compare_startswith: 238.0 ms
strncmp_startswith2: 253.0 ms
strpos_startswith: 349.0 ms
preg_match_startswith: 20,828.7 ms

অবশ্যই, এই মানদণ্ডটি এখনও পুরোপুরি নিরপেক্ষ নাও হতে পারে, তবে আংশিকভাবে মিলে যাওয়া সূগুলি দেওয়ার সময় এটি অ্যালগরিদমের দক্ষতাও পরীক্ষা করে।



5

কেবল একটি সুপারিশ:

function startsWith($haystack,$needle) {
    if($needle==="") return true;
    if($haystack[0]<>$needle[0]) return false; // ------------------------- speed boost!
    return (0===substr_compare($haystack,$needle,0,strlen($needle)));
}

সেই অতিরিক্ত লাইনটি স্ট্রিংয়ের প্রথম চরিত্রের সাথে তুলনা করে, মিথ্যা কেসটি তাত্ক্ষণিকভাবে ফিরিয়ে আনতে পারে , সুতরাং আপনার অনেক তুলনা অনেক দ্রুত করে তুলুন (যখন আমি পরিমাপ করেছি তখন 7x দ্রুত)। সত্যিকারের ক্ষেত্রে আপনি সেই একক লাইনের জন্য কার্যত কোনও মূল্য দিতে হবে না বলে আমি মনে করি এটি অন্তর্ভুক্ত করার উপযুক্ত। (এছাড়াও, বাস্তবে, আপনি যখন নির্দিষ্ট প্রারম্ভের জন্য অনেকগুলি স্ট্রিং পরীক্ষা করেন, বেশিরভাগ তুলনা ব্যর্থ হবে যেহেতু একটি সাধারণ ক্ষেত্রে আপনি যে কোনও বিষয় সন্ধান করছেন))


2
আপনার কোডে বাগ করুন: startsWith("123", "0")দেয়true
টিনো 11

হ্যাঁ, খারাপ! $ চেকিং হয়েছে। দুঃখিত! (ধারণাটি মাত্র 3 লাইনে চিত্রিত করতে চেয়েছিলেন)
ডিস্কেলনার

4

substrফাংশন আসতে পারেন falseঅনেক বিশেষ ক্ষেত্রে, তাই এখানে আমার সংস্করণ, এই বিষয় নিয়ে যা পুলিশ হল:

function startsWith( $haystack, $needle ){
  return $needle === ''.substr( $haystack, 0, strlen( $needle )); // substr's false => empty string
}

function endsWith( $haystack, $needle ){
  $len = strlen( $needle );
  return $needle === ''.substr( $haystack, -$len, $len ); // ! len=0
}

পরীক্ষা ( trueমানে ভাল):

var_dump( startsWith('',''));
var_dump( startsWith('1',''));
var_dump(!startsWith('','1'));
var_dump( startsWith('1','1'));
var_dump( startsWith('1234','12'));
var_dump(!startsWith('1234','34'));
var_dump(!startsWith('12','1234'));
var_dump(!startsWith('34','1234'));
var_dump('---');
var_dump( endsWith('',''));
var_dump( endsWith('1',''));
var_dump(!endsWith('','1'));
var_dump( endsWith('1','1'));
var_dump(!endsWith('1234','12'));
var_dump( endsWith('1234','34'));
var_dump(!endsWith('12','1234'));
var_dump(!endsWith('34','1234'));

এছাড়াও, substr_compareফাংশনটিও দেখার মতো মূল্যবান। http://www.php.net/manual/en/function.substr-compare.php



4

আমি এটি এইভাবে করতে হবে

     function startWith($haystack,$needle){
              if(substr($haystack,0, strlen($needle))===$needle)
              return true;
        }

  function endWith($haystack,$needle){
              if(substr($haystack, -strlen($needle))===$needle)
              return true;
        }

মেলে না হলে মিথ্যা ফিরতে ভুলে যাচ্ছি। ভুল হিসাবে কোনও ফাংশনের রিটার্নের মানটি 'ধরে নেওয়া উচিত নয়' তবে আমি জানি আপনি কমপক্ষে অন্যান্য উত্তরের তুলনায় পরে যাচ্ছেন।
স্পু

3

জেমস ব্লকের উত্তরের উপর ভিত্তি করে, এখানে এর শেষগুলি রয়েছে সংস্করণ সহ:

function startsWith($haystack, $needle, $case=true) {
    if ($case)
        return strncmp($haystack, $needle, strlen($needle)) == 0;
    else
        return strncasecmp($haystack, $needle, strlen($needle)) == 0;
}

function endsWith($haystack, $needle, $case=true) {
     return startsWith(strrev($haystack),strrev($needle),$case);

}

দ্রষ্টব্য: আমি জেমস ব্ল্যাকের প্রারম্ভের ফাংশনটির জন্য if-else অংশটি অদলবদল করেছি, কারণ strncasecmp আসলে strncmp এর কেস-সংবেদনশীল সংস্করণ।


2
মনে রাখবেন যে, strrev()হয় সৃজনশীল কিন্তু খুব ব্যয়বহুল, বিশেষ করে যদি আপনি বলতে স্ট্রিং নেই ... 100 কিলোবাইটের।
অ্যালেক্সিস উইল্ক

নিশ্চিত হওয়ার ===পরিবর্তে ব্যবহার করুন ==0পিএইচপি-তে অনেক কিছুর সমান।
নওফাল

3

নিম্নলিখিতগুলি কেন নয়?

//How to check if a string begins with another string
$haystack = "valuehaystack";
$needle = "value";
if (strpos($haystack, $needle) === 0){
    echo "Found " . $needle . " at the beginning of " . $haystack . "!";
}

আউটপুট:

ভ্যালুহাইস্ট্যাকের শুরুতে পাওয়া গেল মান!

মনে রেখ, strpos খড়ের গর্তে সুই না পাওয়া গেলে মিথ্যা ফিরে আসবে, এবং 0 হলে সূচিটি সূচক 0 (একে একে শুরুতে) পাওয়া গিয়েছিল তবেই ফিরে আসবে।

এবং এখানে সমাপ্তি সাথে:

$haystack = "valuehaystack";
$needle = "haystack";

//If index of the needle plus the length of the needle is the same length as the entire haystack.
if (strpos($haystack, $needle) + strlen($needle) === strlen($haystack)){
    echo "Found " . $needle . " at the end of " . $haystack . "!";
}

এই পরিস্থিতিতে কোনও ফাংশন শুরু হওয়ার দরকার নেই (যেমন) হিসাবে

(strpos($stringToSearch, $doesItStartWithThis) === 0)

সত্য বা মিথ্যা সঠিকভাবে ফিরে আসবে।

এখানে অদ্ভুত সব বন্য ক্রিয়াকলাপ চলছে বলে মনে হচ্ছে এটি এত সাধারণ।


3
অদ্ভুত বলে মনে হচ্ছে আপনি যদি "xy" স্ট্রিং "abcdefghijklmxyz" এর ভিতরে সন্ধান করছেন তবে "x" সাথে "ক" এর তুলনা করে এবং FALSE ফিরছেন, আপনি "a" থেকে "m" পর্যন্ত প্রতিটি অক্ষর দেখতে পান তবে "xy" সন্ধান করবেন স্ট্রিংয়ের ভিতরে এবং শেষ পর্যন্ত আপনি মিথ্যা ফিরে আসেন কারণ এর অবস্থান শূন্য নয়! আপনি যা করছেন এটি এটিই এবং এখানের যে কোনও প্রকারের ক্রিয়াকলাপের তুলনায় এটি বিজোড় এবং বুনো।
ফ্রান্সেসকোএমএম

সরলতা টাইপিংয়ে আছে, যুক্তিতে নয়।
কেদে হাফেন

এটি এতটা যুক্তিযুক্ত নয়, এটি ফ্রান্সিসকো নির্দেশিত সম্ভাব্য অপ্টিমাইজেশন। strpos()এটি মিলবে না তা বাদ দিলে ব্যবহার ধীর হবে। strncmp()এই ক্ষেত্রে আরও ভাল হতে হবে।
অ্যালেক্সিস উইল্ক

আপনি যখন এই জাতীয় নিম্ন স্তরের কার্যাবলী করছেন, আপনি সাধারণত সবচেয়ে গতি-অনুকূলকৃত সমাধানের দিকে যেতে চান, যত জটিলই হোক না কেন এটি কয়েক মিলিয়ন বার বলা হয়ে থাকে। আপনি এখানে লাভ বা হারিয়েছেন এমন প্রতিটি মাইক্রোসেকেন্ড খুব বাস্তব পার্থক্য তৈরি করবে। এটিকে আরও ভাল করে ঝাপিয়ে পড়ুন (এবং তারপরে জটিলতার কথা ভুলে যাবেন, এখন আপনার ফাংশনটি রয়েছে) পরিবর্তে চেহারাটি অনুসন্ধানের পরিবর্তে এবং ভয়াবহ পরিমাণটি পরে হারাবেন যখন আপনি জানেন না যে কী ভুল হয়েছে। মেলে না এমন একটি 2 জিবি স্ট্রিং চেক করার কল্পনা করুন।
dkellner

3

আগের উত্তরগুলির অনেকগুলি ঠিক একইভাবে কাজ করবে। যাইহোক, এটি সম্ভবত এটি যতটা সংক্ষিপ্ত আপনি এটি তৈরি করতে পারেন এবং এটি আপনার ইচ্ছা অনুযায়ী করুন। আপনি কেবল বলেছেন যে আপনি এটি 'সত্যে ফিরে আসতে' চান। সুতরাং আমি এমন সমাধানগুলি অন্তর্ভুক্ত করেছি যা বুলিয়ান সত্য / মিথ্যা এবং পাঠ্যগত সত্য / মিথ্যা প্রত্যাবর্তন করে।

// boolean true/false
function startsWith($haystack, $needle)
{
    return strpos($haystack, $needle) === 0 ? 1 : 0;
}

function endsWith($haystack, $needle)
{
    return stripos($haystack, $needle) === 0 ? 1 : 0;
}


// textual true/false
function startsWith($haystack, $needle)
{
    return strpos($haystack, $needle) === 0 ? 'true' : 'false';
}

function endsWith($haystack, $needle)
{
    return stripos($haystack, $needle) === 0 ? 'true' : 'false';
}

সত্য। যাইহোক, পিটার একটি ফাংশন চেয়েছিলেন যা চরিত্রের স্ট্রিংগুলির সাথে কাজ করবে। যাইহোক, আমি আপনাকে সন্তুষ্ট করতে আমার উত্তর আপডেট করেছি।
wynshaft

সম্পাদনার পরে আপনার সমাধান এখন সম্পূর্ণ অপ্রচলিত। এটি ফিরে আসে 'true'এবং 'false'স্ট্রিং হিসাবে, যা উভয়ই trueবুলিয়ান অর্থে। এটি আন্ডারহ্যান্ডডএক্সকোট ডট কমের মতো কোনও কিছুর জন্য ভাল প্যাটার্ন ;)
টিনো ২

ঠিক আছে, পিটার ঠিক বলেছেন যে তিনি চেয়েছিলেন এটি 'সত্য' ফিরে আসতে পারে। সুতরাং আমি অনুভব করেছি যে তিনি যা চেয়েছিলেন আমি ফিরে আসব। আমি উভয় সংস্করণ যুক্ত করেছি, যদি সে যা চায় তবে তা না হয়।
wynshaft


2

নন-অনুলিপি এবং কোনও ইন্টার্ন-লুপ:

function startsWith(string $string, string $start): bool
{
    return strrpos($string, $start, - strlen($string)) !== false;
}

function endsWith(string $string, string $end): bool
{
    return ($offset = strlen($string) - strlen($end)) >= 0 
    && strpos($string, $end, $offset) !== false;
}

মিঃ হুসের বাস্তবায়নের চেয়ে এটি আরও দ্রুত হওয়া উচিত! আমি এটি বেঞ্চমার্ক করতে পারি
hanshenrik

1

এখানে পিএইচপি 4 এর কার্যকর সমাধান রয়েছে substr_compareof পিএইচপি 5 এর পরিবর্তে ব্যবহার করে আপনি দ্রুত ফলাফল পেতে পারেন strcasecmp(substr(...))

function stringBeginsWith($haystack, $beginning, $caseInsensitivity = false)
{
    if ($caseInsensitivity)
        return strncasecmp($haystack, $beginning, strlen($beginning)) === 0;
    else
        return strncmp($haystack, $beginning, strlen($beginning)) === 0;
}

function stringEndsWith($haystack, $ending, $caseInsensitivity = false)
{
    if ($caseInsensitivity)
        return strcasecmp(substr($haystack, strlen($haystack) - strlen($ending)), $haystack) === 0;
    else
        return strpos($haystack, $ending, strlen($haystack) - strlen($ending)) !== false;
}

0

আপনি এর জন্য fnmatch ফাংশনটি ব্যবহার করতে পারেন ।

// Starts with.
fnmatch('prefix*', $haystack);
// Ends with.
fnmatch('*suffix', $haystack);

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