2009-03-06 11 views
105

मानक PHP तरह से परीक्षण करने के लिए है कि क्या एक स्ट्रिंग $str सबस्ट्रिंग $test के साथ समाप्त होता है:एक PHP स्ट्रिंग किसी अन्य स्ट्रिंग के साथ समाप्त होने का सबसे कुशल परीक्षण क्या है?

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

इस सबसे तेज़ तरीका है?

+2

समान: http://stackoverflow.com/questions/834303/php-startswith- और-endwith-functions – trante

+0

आपको ['s ($ str) -> समाप्त हो सकता है ($ test)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str। PHP # L117) या ['s ($ str) -> endWithIgnoreCase ($ test)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L131) सहायक, जैसा कि [इस स्टैंडअलोन लाइब्रेरी] में पाया गया है (https://github.com/delight-im/PHP-Str)। – caw

उत्तर

132

क्या असफ ने कहा सही है। PHP में बिल्कुल ऐसा करने के लिए एक अंतर्निहित फ़ंक्शन है।

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

अच्छा। ऐसा लगता है कि जगह की तुलना करना सबस्ट्रेट() से तेज होगा, जैसा कि असफ़ ने बताया। –

+2

mcrumley का जवाब अच्छा है, लेकिन इसे '==' 'के बजाय' === 'का उपयोग करना चाहिए। '===' अधिक सख्त है और आमतौर पर जो भी आप चाहते हैं वह करता है, जबकि '==' खराब आश्चर्यों का कारण बन सकता है। mcrumley का तीसरा कोड स्निपेट सही है, लेकिन पहले दो नहीं हैं। substr_compare() कुछ त्रुटि मामलों में झूठी रिटर्न देता है। PHP में, झूठी == 0, इसलिए कोड स्निपेट संकेत देंगे कि स्ट्रिंग पाई गई है। === के साथ, ऐसा नहीं होता है। –

+0

मैं आज एक बग में भाग गया जो आपके द्वारा PHP 5.5.11 और बाद में दिए गए समाधान को तोड़ देगा। https://bugs.php.net/bug.php?id=67043 – user2180613

7

यह इस बात पर निर्भर करता है कि आप किस प्रकार की दक्षता की परवाह करते हैं।

आपका संस्करण सबस्ट्र के उपयोग से अतिरिक्त प्रति के कारण अधिक स्मृति का उपयोग करता है।

एक वैकल्पिक संस्करण प्रतिलिपि बनाने के बिना सबस्ट्रिंग की अंतिम घटना के लिए मूल स्ट्रिंग को खोज सकता है, लेकिन शायद अधिक परीक्षण के कारण धीमा हो जाएगा।

शायद सबसे प्रभावी तरीका स्ट्रिंग और तुलना के अंत तक -sterlen (test) स्थिति से लूप चार-दर-चार करना है। यह तुलना की न्यूनतम मात्रा है जो आप उम्मीद कर सकते हैं और शायद ही कोई अतिरिक्त स्मृति उपयोग की जाती है।

4

एक और तरीका है strrpos function उपयोग करने के लिए होगा:

strrpos($str, $test) == strlen($str) - strlen($test) 

लेकिन वह तेजी से नहीं है।

0

मुझे लगता है कि रिवर्स() जैसे रिवर्स फ़ंक्शंस आपको सबसे तेज़ स्ट्रिंग के अंत से मेल खाने में मदद करेंगे।

63

इस विधि एक छोटा सा अधिक स्मृति-महंगा है, लेकिन यह तेजी से होता है:

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

यह जब आप जानते हैं कि वास्तव में क्या सुई है सबसे अच्छा है, तो आप कड़ी मेहनत से कोड यह उलट सकते हैं। यदि आप सुई को व्यवस्थित रूप से उलट देते हैं, तो यह पहले की विधि से धीमा हो जाता है।

+0

यह इतना चालाक है! मौलिकता के लिए –

+0

+1! –

+2

-1 मुझे गंभीरता से संदेह है कि यह तेज़ है, और यह मुश्किल है (ठंडा लेकिन आमतौर पर सहायक नहीं)। यदि घास * सुई के साथ समाप्त नहीं होता है, तो 'स्ट्रॉप्स' पूरे स्ट्रिंग को सबसे खराब स्थिति में फिर से चालू करेगा जबकि सुई की लंबाई में 'substr_compare' की तुलना की जाएगी। हां, 'substr_compare' को हैस्टैक (और बहुत छोटी सुई) की लंबाई की गणना करने की आवश्यकता होती है, लेकिन इस विधि के लिए * और * इसे पूर्ण रूप से कॉपी करना आवश्यक है, और संभावित रूप से पूरी चीज़ को बूट करने के लिए लोअरकेस में परिवर्तित करना आवश्यक है। –

7

यहाँ है कि क्या एक स्ट्रिंग दूसरे के साथ समाप्त होता है की जांच करने के strpos देकर एक आसान तरीका है एक सही ऑफसेट जहां स्ट्रिंग पाया जाना चाहिए:

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

, सटीक, और मुझे लगता है कि इस PHP 4 में काम करेंगे।

2

मुझे आशा है कि नीचे इस सवाल का जवाब कुशल और भी सरल हो सकता है:

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

यह शुद्ध पीएचपी है, बाहरी फ़ंक्शन कॉल के बिना एस, स्ट्रेल को छोड़कर।

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; 
} 
35
$endsWith = substr_compare($str, $test, -strlen($test)) === 0 

नकारात्मक ऑफसेट "स्ट्रिंग के अंत से गणना शुरू कर"।अगर यह तेजी से है या नहीं

+3

आईएमओ यह प्रदत्त समाधानों से सबसे अच्छा है –

+4

स्वीकार्य उत्तर – FrancescoMM

+0

+200 होना चाहिए यदि मैं कर सकता था। यहां महत्वपूर्ण अंतर्दृष्टि यह है कि ऋणात्मक लंबाई का उपयोग स्ट्रिंग का अंतिम भाग प्राप्त करता है। आप -ve लंबाई के साथ substr का उपयोग भी कर सकते हैं और $ = test के खिलाफ एक == कर सकते हैं। अन्य जवाब गरीब हैं। – Nick

1

पता नहीं है, लेकिन एक ही चरित्र परीक्षण, इन काम करते हैं, के लिए भी:

(array_pop(str_split($string)) === $test) ? true : false; 
($string[strlen($string)-1] === $test) ? true : false; 
(strrev($string)[0] === $test) ? true : false; 
संबंधित मुद्दे

 संबंधित मुद्दे