PaleidžiaWith () ir endWith () funkcijas PHP

Kaip galiu parašyti dvi funkcijas, kurios paima eilutę ir grąžina, jei ji prasideda nuo nurodyto simbolio / eilutės arba baigiasi su juo?

Pavyzdžiui:

 $str = '|apples}'; echo startsWith($str, '|'); //Returns true echo endsWith($str, '}'); //Returns true 
1216
07 мая '09 в 15:14 2009-05-07 15:14 Spustelėkite „Upvote“, kuris buvo pateiktas gegužės 07'09 , 15:14, 2009-05-07 15:14
@ 30 atsakymų
 function startsWith($haystack, $needle) { $length = strlen($needle); return (substr($haystack, 0, $length) === $needle); } function endsWith($haystack, $needle) { $length = strlen($needle); return $length === 0 || (substr($haystack, -$length) === $needle); } 

Naudokite tai, jei nenorite naudoti įprastos išraiškos.

1292
07 мая '09 в 15:24 2009-05-07 15:24 atsakymas pateiktas p. H. 07 gegužės 09 d. 15:24 2009-05-07 15:24

Jei norite patikrinti pradžią ir pabaigą, galite naudoti strrpos ir strpos .

Atkreipkite dėmesį, kad naudojant strrpos kad patikrintumėte, prasideda ir strpos patikrinimas baigiamas kuo greičiau grąžinimu, o ne visos eilutės patikrinimu iki galo. Be to, šis sprendimas nesukuria laikinos eilutės. Pagalvokite, paaiškinkite priežastį, dėl kurios nukrito. Tik todėl, kad f-wit į DWTF nesupranta, kaip ši funkcija veikia, arba mano, kad yra tik vienas sprendimas, tai nereiškia, kad šis atsakymas yra neteisingas.

 function startsWith($haystack, $needle) { // search backwards starting from haystack length characters from the end return $needle === '' || strrpos($haystack, $needle, -strlen($haystack)) !== false; } function endsWith($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; } 
border=0

Bandymai ir rezultatai ( palyginkite su šiuo ):

 startsWith('abcdef', 'ab') -> true startsWith('abcdef', 'cd') -> false startsWith('abcdef', 'ef') -> false startsWith('abcdef', '') -> true startsWith('', 'abcdef') -> false endsWith('abcdef', 'ab') -> false endsWith('abcdef', 'cd') -> false endsWith('abcdef', 'ef') -> true endsWith('abcdef', '') -> true endsWith('', 'abcdef') -> false 

Pastaba: funkcijos strncmp ir substr_compare viršys šią funkciją.

937
06 мая '12 в 21:22 2012-05-06 21:22 atsakymą pateikė Salman A 06 gegužės 12 d. 21:22 2012-05-06 21:22

Atnaujinta 2016 m. Rugpjūčio 23 d

Funkcijos

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

Bandymai

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

Rezultatai (PHP 7.0.9)

(Rūšiuota greičiausiai lėčiau)

 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 

Rezultatai (PHP 5.3.29)

(Rūšiuota greičiausiai lėčiau)

 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

217
24 авг. atsakymas pateikiamas 24 d. 2011-08-24 03:07 '11 at 3:07 2011-08-24 03:07

Atrodo, kad visi atsakymai atlieka daug nereikalingų darbų, strlen calculations , string allocations (substr) ir kt. 'strpos' ir 'stripos' grąžina $needle pirmojo įvykio rodiklį $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; } 
127
14 мая '09 в 0:23 2009-05-14 00:23 atsakymą pateikė Sander Rijken gegužės 14 d., 09:23 , 2009-05-14 00:23
 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); } 

Kreditas :

Patikrinkite, ar linija baigiasi kita linija.

Patikrinkite, ar linija prasideda kita linija.

45
07 мая '09 в 15:15 2009-05-07 15:15 atsakymą pateikė KdgDev gegužės 07 '09, 15:15 2009-05-07 15:15

Įprastinė išraiška galioja aukščiau, bet su įvairiais anksčiau siūlomais nustatymais:

  function startsWith($needle, $haystack) { return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack); } function endsWith($needle, $haystack) { return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack); } 
24
19 июня '09 в 19:11 2009-06-19 19:11 atsakymas pateikiamas tridianą birželio 19 d. 19:11 19:11 2009-06-19 19:11

Jei greitis jums yra svarbus, pabandykite. (Manau, kad tai greičiausias būdas)

Veikia tik styginiams, o jei $ haystack yra tik 1 simbolis

 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 
21
15 дек. atsakymas duotas lepe 15 d. 2009-12-15 11:53 '09, 11:53, 2009-12-15 11:53

Suprantu, kad jis buvo baigtas, bet galite žiūrėti į strncmp , nes leidžia jums lyginti stygos ilgį, pavyzdžiui:

 function startsWith($haystack, $needle, $case=true) { if ($case) return strncasecmp($haystack, $needle, strlen($needle)) == 0; else return strncmp($haystack, $needle, strlen($needle)) == 0; } 
15
17 сент. James Black atsakymas, pateiktas rugsėjo 17 d. 2009-09-17 05:50 '09 at 5:50 am 2009-09-17 05:50

Čia pateikiamos dvi funkcijos, kurios neįvedė laikinos eilutės, kurios gali būti naudingos, kai adatos iš esmės yra didelės:

 function startsWith($haystack, $needle) { return strncmp($haystack, $needle, strlen($needle)) === 0; } function endsWith($haystack, $needle) { return $needle === '' || substr_compare($haystack, $needle, -strlen($needle)) === 0; } 
15
02 авг. Ja͢ck atsakymas 02 rug . 2013-08-02 10:40 '13, 10:40 am 2013-08-02 10:40

Šis klausimas jau turi daug atsakymų, tačiau kai kuriais atvejais galite susitarti dėl kažko paprastesnio nei viskas. Jei jūsų ieškoma eilutė yra žinoma (koduota), galite naudoti reguliarias išraiškas be kabučių ir kt.

Patikrinkite, ar eilutė prasideda „ABC“:

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

baigiasi „ABC“:

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

Savo paprastu atveju norėjau patikrinti, ar eilutė baigiasi brūkšniu:

 preg_match('/\/$/', $myPath); // slash has to be quoted 

Privalumas: kadangi jis yra labai trumpas ir paprastas, nereikia apibrėžti funkcijos (pvz., endsWith() ), kaip parodyta aukščiau.

Bet vėlgi - tai ne kiekvienam atvejui skirtas sprendimas, tai tik labai specifinis.

13
06 янв. atsakymas duotas Nr 2016-01-06 11:59 '16 at 11:59 2016-01-06 11:59

Galite naudoti strpos ir strrpos

 $bStartsWith = strpos($sHaystack, $sNeedle) == 0; $bEndsWith = strrpos($sHaystack, $sNeedle) == strlen($sHaystack)-strlen($sNeedle); 
10
12 мая '15 в 15:36 2015-05-12 15:36 Zero atsakymas į skyrių „ Gegužės 12 d. 15, 15:36 2015-05-12 15:36

Trumpi ir aiškūs vienos eilutės simboliai be reguliarių išraiškų.

prasidedaWith () tiesiai.

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

endWith () naudoja šiek tiek freaky ir lėtą strrev ():

 function endsWith($haystack, $needle) { return (strpos(strrev($haystack), strrev($needle)) === 0); } 
7
29 июня '11 в 1:40 2011-06-29 01:40 atsakymas duotas Dan Jun 29 '11 at 1:40 2011-06-29 01:40

Paprastai baigiu biblioteką, pvz., Pabraukimo-php .

6
23 янв. Atsakymą pateikė yuvilio 23 d. 2015-01-23 06:53 '15 at 6:53 2015-01-23 06:53

Koncentruokite į paleidimą, jei esate tikri, kad linijos nėra tuščios, pridedant pirmojo žodžio testą prieš palyginimą, strlen ir tt šiek tiek pagreitina darbą:

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

Tai kažkaip (20% -30%) greičiau. Įtraukus kitą char testą, pvz., $ Haystack {1} === $ adata {1}, neatrodo, kad darbas pagreitėtų, jis gali net sulėtinti darbą.

=== atrodo greičiau nei == Sąlyginis operatorius (a)?b:c atrodo greičiau nei if(a) b; else c; if(a) b; else c;


Tiems, kurie klausia "kodėl gi ne naudoti strpos?" kviesti kitus sprendimus „nereikalingas darbas“


strpos veikia greitai, bet tai nėra tinkamas įrankis šiam darbui.

Norėdami suprasti, čia yra pavyzdys:

 Search a12345678c inside bcdefga12345678xbbbbb.....bbbbba12345678c 

Ką daro kompiuteris?

  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 

Darant prielaidą, kad strlen neišskiria per visą eilutę (bet net ir šiuo atveju), tai visai nėra patogu.

6
28 июля '13 в 17:00 2013-07-28 17:00 Atsakymą pateikė FrancescoMM liepos 28 d. 13 val. 17:00 2013-07-28 17:00

Mpen“ atsakymas yra neįtikėtinai išsamus, tačiau, deja, pateikiamas etalonas turi labai svarbią ir žalingą priežiūrą.

Kadangi kiekvienas adatas ir šienapjovės baitas yra visiškai atsitiktinis, tikimybė, kad pirmosios bosų poros bus skirtingos pirmajame baitoje, yra 99,609375%, o tai reiškia, kad vidutiniškai apie 99609 iš 100000 porų skirsis nuo pirmo baito. Kitaip tariant, standartas stipriai nukrypsta nuo startswith realizacijų, kurios aiškiai tikrina pirmąjį baitą, kaip strncmp_startswith2 daro strncmp_startswith2 .

Jei vietoj vykdote bandymo kilpą, atlikite šiuos veiksmus:

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

Bandymų rezultatai rodo šiek tiek kitokią istoriją:

 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 

Žinoma, šis testas vis dar negali būti visiškai nešališkas, tačiau jis išbando algoritmų efektyvumą, kai jie taip pat suteikia iš dalies atitinkamas adatas.

5
21 сент. atsakymą pateikė Veeno 21 sep . 2016-09-21 17:31 '16 at 17:31 pm 2016-09-21 17:31

Čia yra kelių baitų saugoma gautos atsakymo versija, ji veikia gerai už UTF-8 eilutes:

 function startsWith($haystack, $needle) { $length = mb_substr($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); } 
5
10 нояб. Atsakymą pateikė Vahid Amiri, lapkričio 10 d. 2017-11-10 16:59 '17, 16:59 pm 2017-11-10 16:59

Tikiuosi, kad toliau pateikiamas atsakymas gali būti veiksmingas ir paprastas:

 $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'; 
5
18 окт. Atsakymas pateikiamas Srinivasan.S 18 spalio. 2013-10-18 16:01 '13, 16:01, 2013-10-18 16:01

Daugeliu specialių atvejų substr funkcija gali grįžti false , todėl čia yra mano versija, kurioje aptariamos šios problemos:

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

Bandymai ( true - tai „geras“):

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

Be to, verta paminėti ir funkciją „ substr_compare . http://www.php.net/manual/en/function.substr-compare.php

4
21 февр. atsakymas, pateiktas biziclop 21 Feb. 2012-02-21 14:52 '12, 14:52 pm 2012-02-21 14:52

:

 function startsWith($str, $needle){ return substr($str, 0, strlen($needle)) === $needle; } function endsWith($str, $needle){ $length = strlen($needle); return !$length || substr($str, - $length) === $needle; } 
4
19 апр. Vincent Pazeller atsakė į 19 balandį 2012-04-19 23:50 '12, 11:50 pm 2012-04-19 23:50

Kodėl gi ne taip?

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

Išvada:

Nustatyta vertė šieno pradžioje!

Turėkite omenyje, kad strpos grąžins strpos , jei adata nerasta šieno strpos , ir grąžina 0, jei ir tik tada, kai adata rastų su 0 indeksu (AKA pradžia).

Ir čia:

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

Tokiu atveju nereikia paleisti () funkcijos kaip

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

grąžina teisingą ar klaidingą.

Atrodo keista, kad tai lengva, nes visos laukinės funkcijos neveikia.

3
30 июня '12 в 6:49 2012-06-30 06:49 atsakymą pateikė Kade Hafen , birželio 30 d., 12 val., 06:49 2012-06-30 06:49

Norėčiau tai padaryti taip:

  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
07 окт. Atsakyti Jelle Keizer 07 spalis 2014-10-07 16:27 '14 at 16:27 2014-10-07 16:27

Jis gali veikti

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

Šaltinis: ngn-wiki.ru.site/questions/3317 / ...

3
04 июня '13 в 11:51 2013-06-04 11:51 atsakymą pateikė user507410 birželio 4 d. 13 val. 11:51 2013-06-04 11:51

Remiantis Jameso Black atsakymu, čia yra jo versijos su versija:

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

Pastaba Aš pakeitiau „if-other“ dalį į „James Black“ pradžios funkciją, nes strncasecmp iš tikrųjų yra nejautri strncmp versija.

2
30 окт. atsakymas pateikiamas bobo 30 d. 2009-10-30 03:17 '09 3:17 am. 2009-10-30 03:17

Taip pat galite naudoti įprastas išraiškas:

 function endsWith($haystack, $needle, $case=true) { return preg_match("/.*{$needle}$/" . (($case) ? "" : "i"), $haystack); } 
2
22 дек. atsakymą pateikė Freemanas gruodžio mėn 2010-12-22 17:40 '10, 17:40, 2010-12-22 17:40

Tiesiog rekomendacija:

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

Ši papildoma eilutė, lygindama pirmuosius eilučių simbolius, gali iš karto grąžinti klaidingą atvejį, todėl daugelis jūsų palyginimų yra žymiai pagreitinti (7 kartus greičiau, kai matuojau). Tikru atveju jums nereikia mokėti beveik jokios kainos už šią konkrečią liniją, todėl manau, kad verta. (Be to, praktiškai, kai bandote kelias eilutes tam tikram pradiniam fragmentui, dauguma palyginimų neveiks, nes tipišku atveju ieškote ko nors).

2
26 июля '16 в 23:02 2016-07-26 23:02 Atsakymą dkellner pateikė liepos 26 d. 16, 23:02 2016-07-26 23:02

Tai yra veiksmingas sprendimas, skirtas PHP 4. Galite gauti greitesnius rezultatus, jei PHP 5, naudojant strcasecmp(substr(...)) vietoj 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; } 
1
19 апр. Patrick Smith atsakymas 19 d 2011-04-19 08:05 '11, 08:05 2011-04-19 08:05

Daugelis ankstesnių atsakymų veiks taip pat gerai. Tačiau tai įmanoma taip trumpai, kaip galite tai padaryti, ir daryti tai, ko reikia. Jūs tiesiog pareiškiate, kad norite, kad jis sugrįžtų teisingai. Todėl įtraukiau sprendimus, kurie grąžina loginę vertę true / false ir teksto reikšmę true / false.

 // 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'; } 
1
06 дек. Atsakymas pateikiamas „ Wynshaft 06“. 2013-12-06 22:45 '13, 10:45 pm 2013-12-06 22:45
 $ends_with = strrchr($text, '.'); // Ends with dot $start_with = (0 === strpos($text, '.')); // Starts with dot 
0
25 авг. atsakymas duotas ymakux 25 rug . 2015-08-25 20:31 '15 , 8:31 pm 2015-08-25 20:31

Greičiausiai baigiasi ():

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

Orientyras:

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

Bandymo rezultatai:

 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 
0
24 июля '18 в 9:05 2018-07-24 09:05 atsakymą pateikė Lucas Bustamante liepos 24 d., 18 val. 9:05 2018-07-24 09:05

Nežinau, kodėl žmonėms taip sunku. Substras atlieka puikų darbą ir yra veiksmingas, nes jums nereikia ieškoti visos eilutės, jei ji neatitinka.

Be to, kadangi aš netikrinu sveiko skaičiaus vertybių, bet lyginant stygas, man nereikia nerimauti dėl griežto atvejo ===. Tačiau === geras įprotis įvesti.

 function startsWith($haystack,$needle) { substring($haystack,0,strlen($needle)) == $needle) { return true; } return false; } function endsWith($haystack,$needle) { if(substring($haystack,-strlen($needle)) == $needle) { return true; } return false; } 

arba dar geriau optimizuotas.

 function startsWith($haystack,$needle) { return substring($haystack,0,strlen($needle)) == $needle); } function endsWith($haystack,$needle) { return substring($haystack,-strlen($needle)) == $needle); } 
-2
07 окт. atsakymas pateikiamas Spoo 07 okt. 2016-10-07 22:49 '16 at 22:49 PM 2016-10-07 22:49

Kiti klausimai apie žymių arba Užduoti klausimą