ආරම්භයත් සමඟ () සහ අවසානය PHP හි () සමඟ ක්‍රියා කරයි


1491

නිශ්චිත අක්ෂර / නූලකින් ආරම්භ වී හෝ එය අවසන් වුවහොත්, නූලක් ගෙන ආපසු එන ශ්‍රිත දෙකක් මා ලියන්නේ කෙසේද?

උදාහරණයක් වශයෙන්:

$str = '|apples}';

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

20
හොඳින් පරීක්ෂා කරන ලද ක්‍රම සඳහා Laravel 's Str class startWith () සහ endWith () බලන්න . එජ් නඩු වලට මුහුණ දී ඇති බැවින් මෙම කේතය පුළුල් ලෙස භාවිතා කිරීම වාසියකි.
ග්‍රාස් ඩබල්

1
මෙම ස්වාධීන පුස්තකාලයේ ඇති පරිදි ඔබට සොයා ගත හැකි s($str)->startsWith('|')සහ s($str)->endsWith('}')ප්‍රයෝජනවත් විය හැකිය .
caw

3
අවවාදයයි: මෙහි බොහෝ පිළිතුරු යූටීඑෆ් -8 වැනි බහු-බයිට් කේතීකරණයේදී විශ්වාස කළ නොහැකි ය.
ඇල්වාරෝ ගොන්සාලෙස්

මගේ ඉහත අදහස් දැක්වීමෙන් පසුව, ඔබට නවතම අනුවාදය භාවිතා කිරීමට වග බලා ගත හැකිය (අද වන විට 5.4 ). ආරම්භයත් සමඟ විශාල පිදුරු නූල් සඳහා ප්‍රශස්තිකරණය කර තිබීම විශේෂත්වයකි.
ග්‍රාස් ඩබල්

Answers:


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

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

ඔබට රීජෙක්ස් භාවිතා කිරීමට අවශ්‍ය නැතිනම් මෙය භාවිතා කරන්න.


14
මම කියන්නේ endWith ('foo', '') == false යනු නිවැරදි හැසිරීමයි. මෝඩයා කිසිම දෙයකින් අවසන් නොවන නිසා. 'ෆූ' අවසන් වන්නේ 'ඕ', 'ඕ' සහ 'ෆූ' ය.
MrHus

128
EndsWith ඉතා කෙටි ලෙස ලිවිය හැකිය:return substr($haystack, -strlen($needle))===$needle;
Rok Kralj

7
@RokKralj නමුත් $needleහිස් නොවේ නම් පමණි .
ජාක්

12
තෙවන පරාමිතිය ලෙස ifසම්මත කිරීමෙන් ඔබට සම්පූර්ණයෙන්ම වළක්වා ගත හැකිය : . මෙය නඩුව හසුරුවන්නේ හිස් නූලක් ආපසු ලබා දීමෙනි . $lengthsubstrreturn (substr($haystack, -$length, $length);$length == 0$haystack
mxxk

20
RMrHus බහු බයිට් ආරක්ෂිත කාර්යයන් භාවිතා කිරීමට මම නිර්දේශ කරමි, උදා: mb_strlen සහ mb_substr
19Gerhard85

1029

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

මෙය PHP 7 ( මිණුම් සලකුණු ස්ක්‍රිප්ට් ) හි වේගවත්ම විසඳුමක් විය යුතුය . 8KB පිදුරු, විවිධ දිග ඉඳිකටු සහ සම්පූර්ණ, අර්ධ හා ගැලපුම් අවස්ථා වලට එරෙහිව පරීක්ෂා කර ඇත. strncmpආරම්භය සඳහා වේගවත් ස්පර්ශයක් වන නමුත් එයට කෙළවර පරීක්ෂා කළ නොහැක.


76
මෙම පිළිතුර එය ඩේලි ඩබ්ලිව්ටීඑෆ් වෙත ලබා දුන්නේය! : D thedailywtf.com/articles/…
Wim ten Brink

මෙම පිළිතුරේ පැරණි අනුවාදයකට av ඩේවිඩ් වොලස් සහ ran ෆ්‍රැන්සිස්කෝඑම්එම් අදහස් අදාළ වන බව කරුණාවෙන් සලකන්න. වර්තමාන පිළිතුර භාවිතා strrposකරන්නේ ඉඳිකටුවක් පිදුරු ගොඩේ ආරම්භයට නොගැලපේ නම් වහාම (අසමත් විය යුතු) ය.
සල්මාන් ඒ

2
මට ඒක තේරෙන්නේ නැහැ. Php.net/manual/en/function.strrpos.php මත පදනම්ව : "අගය negative ණ නම්, ඒ වෙනුවට බොහෝ අක්ෂර වලින් සෙවීම ආරම්භ වනු ඇත. මෙයින් පෙනී යන්නේ අප 0 අක්ෂරයෙන් ආරම්භ වී ඇති නිසා ( එතැනින් -strlength($haystack)) පසුපසට සෙවීමද ? එයින් අදහස් කරන්නේ ඔබ කිසිවක් සොයන්නේ නැති බව නොවේද? මටත් මේක තේරෙන්නේ නැහැ !== false. මම හිතන්නේ මෙය PHP හි විචල්‍යතාවයක් මත රඳා පවතින අතර සමහර අගයන් "සත්‍ය" සහ අනෙක් ඒවා "ව්‍යාජ" නමුත් මෙම නඩුවේ එය ක්‍රියාත්මක වන්නේ කෙසේද?
වෙල්බොග්

3
El වෙල්බෝග්: උදාහරණයක් ලෙස පිදුරු = xxxyyyඉඳිකටුවක් = yyyසහ strrposසෙවීම භාවිතා කිරීම ආරම්භයේ සිටම ආරම්භ වේ x. දැන් අපට මෙහි සාර්ථක ගැලපීමක් නොමැත (y වෙනුවට x සොයාගෙන ඇත) අපට තවදුරටත් පසුපසට යා නොහැක (අපි නූල් ආරම්භයේදී) සෙවීම වහාම අසාර්ථක වේ . භාවිතා කිරීම ගැන !== false- strrposඉහත උදාහරණයේ 0 හෝ අසත්‍යය මිස වෙනත් අගයක් නොලැබේ. ඒ හා සමානව, strposඉහත උදාහරණයේ දී ආපසු පැමිණිය හැකිය $temp(අපේක්ෂිත ස්ථානය) හෝ අසත්‍යය. මම ගියා !== false, ස්ථාවර සඳහා නොව ඔබ භාවිතා කළ හැකි === 0හා === $tempපිළිවෙළින් කාර්යයන්.
සල්මාන් ඒ

8
පිදුරු විශාල වන අතර ඉඳිකටුවක් නොමැති නම් strpos === 0 භයානක විසඳුමක් බව දැනටමත් තහවුරු කර ඇත.
සල්මාන් ඒ

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

ප්‍රති Results ල (PHP 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

ප්‍රති Results ල (PHP 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

startwith_benchmark.php


3
ඔබේ පරීක්ෂණ වලදී මෙන් නූල් හිස් නොවේ නම්, මෙය සැබවින්ම කෙසේ හෝ (20-30%) වේගවත් වේ: function startswith5b($haystack, $needle) {return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;}මම පහත පිළිතුරක් එක් කළෙමි.
ෆ්‍රැන්චෙස්කෝ එම්

3
110 ජොනී 110 110 133 ට වඩා අඩු නිසා ... ??
mpen

2
ඩාර්න්, මම දන්නේ නැහැ ඒ වෙලාවේ මගේ ඔලුවට ගියේ මොකක්ද කියලා. නින්ද නොයෑම.
Jronny

1
එම්පන්, මම දැක්කා අලියා කොහෙත්ම නැහැ :(
විස්මන්

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
දැඩි () දෙය අනවශ්‍ය නොවේ. දී ඇති ඉඳිකටුවෙන් නූල් ආරම්භ නොවන්නේ නම් ur ර් කේතය අනවශ්‍ය ලෙස මුළු පිදුරු මංකොල්ලයනු ඇත.
AppleGrew

5
Ark සලකුණු කරන්න, ආරම්භය පරික්ෂා කිරීම වඩා වේගවත්ය, විශේෂයෙන් ඔබ MIME වර්ග පරීක්ෂා කිරීම වැනි දෙයක් කරන්නේ නම් (හෝ
නූල

2
@mark මම වරහන් පිදුරු 1000 ක් සහ චාර් ඉඳිකටුවක් 10 ක් හෝ 800 ක් සමඟ මිණුම් සලකුණු කිහිපයක් කළෙමි. යමක්
වේගවත්ද

7
ඔබ දැඩි වැනි ඉඳිකටු උපුටා දක්වමින් සලකා බැලිය යුතුය strpos($haystack, "$needle", 0)තියෙනවා නම් ඕනෑම එය (එය එනවා නම් උදා, වැලක් දැනටමත් නොවේ අවස්ථාවක් json_decode()). එසේ නොමැතිනම්, [අමුතු] පෙරනිමි හැසිරීම strpos()අනපේක්ෂිත ප්‍රති results ල ඇති කළ හැකිය: “ ඉඳිකටුවක් නූලක් නොවේ නම්, එය පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය කර
අක්ෂරයක

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
සිද්ධි සංවේදී නොවන කාර්යයන් කිරීමට හොඳම ක්‍රමය strtolower නොවේ. සමහර ස්ථානවල ආවරණ ඉහළ සහ පහළ වලට වඩා සංකීර්ණ වේ.
සැන්ඩර් රිජ්කන්

8
මට පෙනෙන්නේ පැමිණිලි කිරීම සහ විසඳුමක් නොමැති බවයි ... ඔබ එය නරක යැයි පැවසුවහොත් එය එසේ විය යුතු ආකාරය පිළිබඳ උදාහරණයක් ඔබ ලබා දිය යුතුය.
KdgDev

2
E වෙබ් ඩෙව්හෝබෝ: ඔබේ අදහස් දැක්වීමට දිනකට පෙර මා විසින්ම පිළිතුරක් එක් කළේ එබැවිනි. මක්නිසාද යත් ඔබේ කේතය strcasecmp ඇත්තෙන්ම නිවැරදි දෙයයි.
සැන්ඩර් රිජ්කන්

29

ඉහත රීජෙක්ස් ක්‍රියා කරයි, නමුත් අනෙක් යෝජනා සමඟද ඉහත යෝජනා කර ඇත:

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

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

2
නූල් මෙහෙයුම් සඳහා php හි පරාමිති අනුපිළිවෙල $ පිදුරු, $ ඉඳිකටුවක් වේ. මෙම ශ්‍රිත පසුපසට වන අතර ඇණවුම් කිරීම ඇත්ත වශයෙන්ම $ ඉඳිකටුවක්, y පිදුරු මල්ලක් ඇති අරා ශ්‍රිත මෙන් ක්‍රියා කරයි.
ඇන්ඩි

29

මෙම ප්‍රශ්නයට දැනටමත් බොහෝ පිළිතුරු ඇත, නමුත් සමහර අවස්ථාවල ඔබට ඒ සියල්ලටම වඩා සරල දෙයකට විසඳුම් ලබා දිය හැකිය. ඔබ සොයන නූල දන්නේ නම් (දෘ c කේත කර ඇත), ඔබට කිසිදු උපුටා දැක්වීමකින් තොරව සාමාන්‍ය ප්‍රකාශන භාවිතා කළ හැකිය.

'ABC' සමඟ නූලක් ආරම්භ වේදැයි පරීක්ෂා කරන්න:

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

'ABC' සමඟ අවසන් වේ:

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

මගේ සරල අවස්ථාවෙහිදී, කප්පාදුවකින් නූලක් අවසන් වේදැයි පරීක්ෂා කිරීමට මට අවශ්‍ය විය:

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

වාසිය: එය ඉතා කෙටි හා සරල බැවින්, endsWith()ඉහත පෙන්වා ඇති පරිදි ශ්‍රිතයක් (වැනි ) නිර්වචනය කිරීමට ඔබට අවශ්‍ය නැත .

නමුත් නැවතත් - මෙය සෑම අවස්ථාවකටම විසඳුමක් නොවේ, මෙය ඉතා සුවිශේෂී එකක් පමණි.


ඔබට නූල තදින් කේත කිරීමට අවශ්‍ය නැත. රීජෙක්ස් ගතික විය හැකිය.
රයන්

2
එය සත්‍යයකි, නමුත් නූල දෘඩ කේත කර නොමැති නම්, ඔබ එයින් ගැලවිය යුතුය. දැනට මෙම ප්‍රශ්නයට පිළිතුරු 2 ක් ඇත. මෙය පහසුය, නමුත් එය කේතය ටිකක් සංකීර්ණ කරයි. ඉතින් මගේ අදහස වූයේ දෘ c කේතීකරණය කළ හැකි ඉතා සරල අවස්ථාවන් සඳහා ඔබට එය සරලව තබා ගත හැකි බවයි.
noamtm

1
ඔබට කප්පාදුවෙන් බේරීමට අවශ්‍ය නැත, ඔබට රීජෙක්ස් වෙනත් අක්ෂරයකින් ඔතා තැබිය හැකිය, වැනි @, එම නිසා කප්පාදුව ( /) ගැලවිය යුතු නොවේ. උදාහරණ # 3 බලන්න: php.net/manual/en/function.preg-match.php .
cjbarth

ස්තූතියි @cjbarth. මගේ පිළිතුර ඒ අනුව වෙනස් කළා. BTW, "#" යනු කප්පාදුවක් සමඟ කටයුතු කිරීමේදී php.net/manual/en/regexp.reference.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
මෙය බොහෝ විට වඩාත්ම කාර්යක්ෂම පිළිතුර විය හැකි හෙයින් කිසිදු ශ්‍රිතයක් අතිරේක ලෙස භාවිතා නොකිරීම සාමාන්‍ය


1
නිර්මාණශීලී. පිදුරු අඩංගු ඉඳිකටු. BTW සමඟ සමහර අවලස්සන endsWithChar('','x')
Tino

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 හොඳම පිළිතුර වේ. නමුත් endsWidthකළ යුත්තේ return $needle==='' || substr_compare(... ඒ නිසා එය අපේක්ෂිත පරිදි ක්‍රියාත්මක වන -strlen($needle)===0අතර, නිවැරදි කිරීමකින් තොරව endsWith('a','')ආපසු පැමිණේfalse
ටිනෝ

InTino ස්තූතියි ... එය substr_compare()ඇත්ත වශයෙන්ම දෝෂයක් යැයි මට හැඟේ , එබැවින් එය නිවැරදි කිරීම සඳහා මම PR එකක් එකතු කර ඇත්තෙමි :)
Ja͢ck

3
ඇමතුම endsWith('', 'foo')අනතුරු ඇඟවීමක් අවුලුවයි: “substr_compare (): ආරම්භක ස්ථානය ආරම්භක නූල් දිග ඉක්මවිය නොහැක”. සමහර විට එය තවත් දෝෂයකි substr_compare(), නමුත් එය වළක්වා ගැනීමට ඔබට පෙර පරීක්‍ෂණයක් අවශ්‍ය වේ ... || (strlen($needle) <= strlen($haystack) && substr_compare(...) === 0);
gx_

codegx_ තවත් කේත සමඟ මන්දගාමී වීමට අවශ්‍ය නැත. return $needle === '' || @substr_compare(මෙම අනතුරු ඇඟවීම මැඩපැවැත්වීමට .. භාවිතා කරන්න .
ටිනෝ

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

මිණුම් සලකුණු ප්‍රති Results ල:

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 විවිධ විසඳුම් සංසන්දනය කිරීමට කාලය ගැනීම සඳහා සහ ඒවා ඇත්ත වශයෙන්ම මිණුම් සලකුණු කිරීම සඳහා! භාෂාව පරිණාමය වන විට ප්‍රශස්තිකරණයන් සිදු කරන බැවින් ඔබ භාවිතා කළ PHP අනුවාදයද සඳහන් කළ යුතුය! එක් PHP අනුවාදයක සිට තවත් PHP අනුවාදයක සංසන්දනාත්මක ක්‍රියාකාරකම්වල කැපී පෙනෙන දියුණුවක් මා දැක ඇත :)
ක්‍රිස්ටෝෆ් ඩෙලියන්ස්

1
h ක්‍රිස්ටෝෆෙඩෙලියන්ස් සහ PHP අනුවාදය ලබා දෙන ලෙස ඔහු කළ ඉල්ලීම. මම ඔබේ පරීක්ෂණය 7.3.2 දින ධාවනය කළ අතර ඒ හා සමාන ප්‍රති results ල FWIW ලබා ගත්තා.
ජෙෆ්

16

මෙය අවසන් වී ඇති බව මට වැටහී ඇත, නමුත් ඔබට strncmp දෙස බැලීමට අවශ්‍ය විය හැකි බැවින් එය සංසන්දනය කිරීම සඳහා නූල් වල දිග තැබීමට ඉඩ සලසයි, එබැවින්:

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

ඔබ මෙය අවසන් කරන්නේ කෙසේද?
mpen

Ark මාක් - ඔබට පිළිගත් පිළිතුර දෙස බැලිය හැකිය, නමුත් මම ප්‍රධාන වශයෙන් strncmp භාවිතා කිරීමට කැමැත්තක් දක්වන්නේ එය ආරක්ෂිත යැයි සිතන බැවිනි.
ජේම්ස් බ්ලැක්

මම විශේෂයෙන් අදහස් කළේ strncmp සමඟයි. ඔබට ඕෆ්සෙට් එකක් නියම කළ නොහැක. එයින් අදහස් වන්නේ ඔබේ අන්තය සමඟ ශ්‍රිතයට සම්පූර්ණයෙන්ම වෙනස් ක්‍රමයක් භාවිතා කළ යුතු බවයි.
mpen

Ark මාක් - කෙළවර සඳහා මම strrpos ( php.net/manual/en/function.strrpos.php ) භාවිතා කරමි , නමුත්, සාමාන්‍යයෙන්, ඔබ strcmp strncmp භාවිතා කිරීමට යන ඕනෑම වේලාවක ආරක්ෂිත විකල්පයකි.
ජේම්ස් බ්ලැක්

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

පිළිගත් පිළිතුරේ බහු-බයිට් ආරක්ෂිත අනුවාදය මෙන්න, එය UTF-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
මට හොඳටම විශ්වාසයි මෙය CPU හි නාස්තියක් පමණක් බව. ස්ටාර්ස්ට්විත් සහ එන්ඩ්ස්විත් සඳහා ඔබ පරික්ෂා කළ යුතු සියල්ලම, බයිට් ගැලපෙන්නේ දැයි පරික්ෂා කරයි, පිළිගත් පිළිතුර හරියටම එයයි. ඉඳිකටුවේ අක්ෂර 8 ක් ගණනය කිරීම සඳහා මෙම කාලය නාස්ති වන අතර, පිදුරු මල්ලේ n'th utf8 අක්ෂරයේ පිහිටීම කොතැනද .. මම සිතන්නේ 100% ක්ම නිශ්චිතවම කිවහොත් මෙය cpu නාස්තියකි. පිළිගත් පිළිතුර අසමත් වූ සත්‍ය පරීක්‍ෂණයක් ඔබට ඉදිරිපත් කළ හැකිද?
hanshenrik

2
@ හන්ෂෙන්රික් - යූටීඑෆ් 8 හා සමාන බයිට් අඩංගු නූලක් සොයන විට එය ඉතා දුර්ලභ අවස්ථාවකි, නමුත් අවසාන අක්ෂරයෙන් අඩක් අතුරුදහන් විය. හරියට, ඔබට යුනිකෝඩ් සී 5 91 (අකුර "ő") ඇති අතර ඔබ සී 5 (අකුර "Å") සොයන්නේ එය ඔබට ගැලපීමක් ලබා නොදිය යුතුය. අනෙක් අතට, නිසැකවම, ඔබ යූටීඑෆ් නොවන ඉඳිකටුවක් සඳහා යූටීඑෆ් පිදුරු මල්ලක් සොයන්නේ ඇයි ... නමුත් වෙඩි නොවදින චෙක්පත් සඳහා මෙය හැකියාවක් ලෙස සැලකිය යුතුය.
dkellner

දී startsWithඑය විය යුතු$length = mb_strlen($needle, 'UTF-8');
තෝමස් Kekeisen

2
HThomasKekeisen ස්තූතියි, එය නිවැරදි කළා.
වහීඩ් අමිරි

8

නිත්‍ය ප්‍රකාශන නොමැතිව කෙටි හා පහසුවෙන් තේරුම් ගත හැකි එක්-ලයිනර්.

startWith () කෙළින්ම ඉදිරියට.

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

endWith () තරමක් විසිතුරු හා මන්දගාමී strrev () භාවිතා කරයි:

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

@FranscoMM: strpos යනු “නිවැරදි මෙවලම” නොවේ ... ඇයි? එවිට “නිවැරදි මෙවලම්” මොනවාද? සංස්කරණය කරන්න: මම ඔබේ පිළිතුර පහතින් කියෙව්වා. මම හිතුවේ ක්‍රමලේඛනය ඔබ සතුව ඇති සම්පත් භාවිතා කිරීම නව නිපැයුමක් හා සමාන බවයි .. එබැවින් හරි හෝ වැරදි නැත ... වැඩ කිරීම හෝ වැඩ නොකිරීම පමණි ... කාර්ය සාධනය ද්විතීයික ය.
Fr0zenFyr

"එය සෙවීම සඳහා මෙවලමක් මිස සංසන්දනය කිරීම සඳහා නොවේද?" Cit. ඇරිස්ටෝටල්ස්
ෆ්‍රැන්චෙස්කෝ

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;


"ඇයි strpos භාවිතා නොකරන්නේ?" වෙනත් විසඳුම් "අනවශ්‍ය වැඩ" ලෙස හැඳින්වීම


strpos වේගවත් නමුත් එය මෙම කාර්යය සඳහා නිවැරදි මෙවලම නොවේ.

තේරුම් ගැනීමට, උදාහරණයක් ලෙස මෙහි කුඩා අනුකරණයක් ඇත:

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
Ack ජැක් ඔව්, ඇත්ත වශයෙන්ම, අදහස වන්නේ සංඛ්‍යානමය වශයෙන් එය සිදු වන බැවින් වේගවත් කිරීම සාමාන්‍යයෙන් සමස්ත පරීක්ෂණ කට්ටලයට වඩා 20% -30% කි (එය වෙනස් නොවන අවස්ථා ඇතුළුව). ඒවා වෙනස් වූ විට ඔබ බොහෝ දේ ලබා ගන්නා අතර ඒවා නොමැති විට ඉතා සුළු ප්‍රමාණයක් ලිහිල් වේ. සාමාන්‍යයෙන් ඔබ එම 30% ලබා ගනී (කට්ටලය අනුව වෙනස් වේ, නමුත් බොහෝ විට ඔබ විශාල පරීක්ෂණ වල වේගය ලබා ගනී)
ෆ්‍රැන්චෙස්කෝඑම්එම්

"නමුත් එය මෙම කාර්යය සඳහා නිවැරදි මෙවලම නොවේ" ... කිසියම් උපුටා දැක්වීමක් තිබේද?
Fr0zenFyr

1
ඩබ්ලිව්ටීඑෆ්. ඊට වඩා වැඩි ගණනක් මා සඳහන් කළ යුත්තේ කාටද? හස්තයේ අක්‍ෂරය 'අ' නොවන බව ඔබට පැවසීමට ඔබ නූලක අවසානය දක්වා සොයන ශ්‍රිතයක් භාවිතා කරනවාද? එය සැලකිලිමත් වන්නේ කවුද? එය නිවැරදි මෙවලම නොවේ, මන්ද එය සෙවීම සඳහා වූ මෙවලමක් මිස සංසන්දනය කිරීම සඳහා නොවේ, පැහැදිලිව සඳහන් කිරීමට ඇරිස්ටෝටලීස් උපුටා දැක්වීමේ අවශ්‍යතාවක් නැත!
ෆ්‍රැන්චෙස්කෝ

7

පහත පිළිතුර කාර්යක්ෂම හා සරල විය හැකි යැයි මම බලාපොරොත්තු වෙමි:

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

7

PHP 8 යාවත්කාලීන කිරීම

මෙම ගැටලුවට කාර්ය සාධනය සහ පහසු විසඳුමක් ලබා දෙන නව str_starts_withසහ str_ends_withකාර්යයන් PHP 8 ට ඇතුළත් වේ :

$str = "beginningMiddleEnd";
if (str_starts_with($str, "beg")) echo "printed\n";
if (str_starts_with($str, "Beg")) echo "not printed\n";
if (str_ends_with($str, "End")) echo "printed\n";
if (str_ends_with($str, "end")) echo "not printed\n";

මෙම මෙම ලක්ෂණය සඳහා RFC හුරුවට හා පැහැදිලිව පෙනෙන (සහ එතරම් පැහැදිලි නැත) userland ක්රියාවට නැංවීම් ගැටලු සාකච්ඡා වැඩි විස්තර සපයන හා, ද.


... PHP8 අන්තර්ගතය සමඟ හොඳ සහ මුල් අවධියේදී තොග පිටාර ගැලීම
මික්මාකුසා

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පළමු බයිටය පැහැදිලිවම පරික්ෂා කරන පරිදි ක්‍රියාත්මක කිරීම කෙරෙහි මිණුම් ලකුණ දැඩි ලෙස පක්ෂග්‍රාහී strncmp_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 />";

මිණුම් සලකුණු ප්‍රති results ල තරමක් වෙනස් කතාවක් කියයි:

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($str, $needle){
   return substr($str, 0, strlen($needle)) === $needle;
}

function endsWith($str, $needle){
   $length = strlen($needle);
   return !$length || substr($str, - $length) === $needle;
}

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
ටිනෝ

ඔව්, නරකයි! $ පරීක්ෂා කිරීම සිදු විය. සමාවන්න! (3 වන පේළියේ සංකල්පය නිදර්ශනය කිරීමට අවශ්‍ය විය)
dkellner

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()එය නිර්මාණශීලී නමුත් ඉතා මිල අධික බව සලකන්න , විශේෂයෙන් ඔබට කියවීමේ නූල් තිබේ නම් ... 100Kb.
ඇලෙක්සිස් විල්කේ

සහතික වීමට ===වෙනුවට භාවිතා කරන්න ==. 0PHP හි බොහෝ දේ වලට සමාන වේ.
නව්ෆල්

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 . "!";
}

ප්‍රතිදානය:

Valuehaystack ආරම්භයේදී හමු වූ අගය!

මතක තබා ගන්න, strposපිදුරු මඩුවේ ඉඳිකටුවක් හමු නොවුනහොත් ව්‍යාජ ලෙස නැවත පැමිණෙනු ඇති අතර, 0 දර්ශකය 0 (AKA ආරම්භය) හි දී ඉඳිකටුවක් හමු වූයේ නම් පමණක් 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
අමුතු බවක් පෙනේ, ඔබ "x" යන්න "අ" හා සැසඳීම වෙනුවට "අබ්කෙඩෙෆ්ජිජ්ක්ලම්සි" යන නූලෙන් "x" සොයන්නේ නම්, ඔබ "අ" සිට "එම්" දක්වා සෑම අක්ෂරයක්ම බැලූ විට "xy" සොයා ගැනීම අවසන් වේ. නූල් ඇතුලත, අවසානයේ ඔබ අසත්‍යය ආපසු එවන්නේ එහි පිහිටීම ශුන්‍ය නොවන බැවිනි! ඔබ කරන්නේ මෙයයි, මෙහි ඇති වෙනත් කිසිදු ප්‍රචලිත කාර්යයකට වඩා එය අමුතු හා වල් ය.
ෆ්‍රැන්චෙස්කෝ එම්එම්

සරල බව ටයිප් කිරීමේදී මිස තර්කනයෙහි නැත.
කේඩ් හැෆන්

එය එතරම් තර්කනය නොවේ, එය ෆ්‍රැන්ස්කෝ පෙන්වා දුන් ප්‍රශස්තකරණයයි. strpos()ගැලපෙන විට හැර භාවිතා කිරීම මන්දගාමී වේ. strncmp()මෙම අවස්ථාවේ දී වඩා හොඳ වනු ඇත.
ඇලෙක්සිස් විල්කේ

ඔබ එවැනි පහත් මට්ටමේ කාර්යයන් කරන විට, ඔබට සාමාන්‍යයෙන් අවශ්‍ය වන්නේ වඩාත් වේගවත් වුවද, කොතරම් සංකීර්ණ වුවත්, මෙය මිලියන ගණනක් ලෙස හැඳින්වේ. ඔබ මෙහි ලබා ගන්නා හෝ අහිමි වන සෑම මයික්‍රෝ තත්පරයකම සැබෑ වෙනසක් සිදු කරනු ඇත. පෙනුමෙන් ඉදිරියට යාම වෙනුවට වැරදියට සිදුවී ඇත්තේ කුමක්දැයි ඔබ පවා නොදන්නා විට භයානක කාලය නැති කර ගැනීම වෙනුවට, නිරය එයින් ඉවත් කිරීම වඩා හොඳය (පසුව සංකීර්ණත්වය අමතක කරන්න, දැන් ඔබට ක්‍රියාකාරීත්වය ඇත). නොගැලපෙන 2GB නූලක් පරීක්ෂා කිරීම ගැන සිතා බලන්න.
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එය වීජ අර්ථයෙන්. Underhanded.xcott.com වැනි දේ සඳහා එය හොඳ රටාවකි ;)
ටිනෝ

හොඳයි, පීටර් කියා සිටියේ එය 'සත්‍ය' බවට පත්වීමට අවශ්‍ය බවය. ඉතින් මම හිතුවා ඔහු ඉල්ලපු දේ මම ආපහු දෙන්නම් කියලා. මම අනුවාද දෙකම එකතු කර ඇත්තෙමි, එය ඔහුට අවශ්‍ය දේ නොවේ නම්.
wynshaft

2

ඔබට නිත්‍ය ප්‍රකාශන භාවිතා කළ හැකිය:

function endsWith($haystack, $needle, $case=true) {
  return preg_match("/.*{$needle}$/" . (($case) ? "" : "i"), $haystack);
}

3
$ ඉඳිකටුවෙන් ගැලවිය යුතුය preg_quote($needle, '/').
ටිමෝ ටිජොෆ්

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

මෙය මිස්ටර් හස් ක්‍රියාත්මක කිරීමට වඩා වේගවත් විය යුතුය! මට එය මිණුම් දණ්ඩක් විය හැකිය
හැන්ෂෙන්රික්

1

මෙන්න PHP 4 සඳහා කාර්යක්ෂම විසඳුමක්. PHP 5 substr_compareවෙනුවට ඒ වෙනුවට භාවිතා කිරීමෙන් ඔබට වේගවත් ප්‍රති results ල ලබා ගත 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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.