एक स्ट्रिंग की शुरुआत से एक स्ट्रिंग निकालें


146

मेरे पास एक स्ट्रिंग है जो इस तरह दिखता है:

$str = "bla_string_bla_bla_bla";

मैं पहले को कैसे हटा सकता हूं bla_; लेकिन केवल अगर यह स्ट्रिंग की शुरुआत में पाया जाता है?

इसके साथ str_replace(), यह सभी को हटा देता है bla_


1
आपको s($str)->replacePrefix('_bla')मदद मिल सकती है , जैसा कि इस स्टैंडअलोन लाइब्रेरी में पाया गया है ।
कांव-कांव

जवाबों:


339

सादा रूप, बिना रेगेक्स:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';

if (substr($str, 0, strlen($prefix)) == $prefix) {
    $str = substr($str, strlen($prefix));
} 

लेता है: 0.0369 एमएस (0.000,036,954 सेकंड)

और साथ:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);

लेता है: 0.1749 एमएस (0.000,174,999 सेकंड) के बाद 1 रन (संकलन), और 0.0510 एमएस (0.000,051,021 सेकंड)।

मेरे सर्वर पर, जाहिर है।


8
मैंने कभी नहीं देखा है कि टर्नरी ऑपरेटर को इतनी बुरी तरह से गाली देते हुए, एक साधारण व्यक्ति if(condition) { statement }इतना अधिक स्पष्ट होता।
तातु उलेमेन

4
@ सालाठे: मैं आलोचना स्वीकार करता हूं। यह देखने के लिए एक व्यक्तिगत जिज्ञासा थी कि सबसे तेज़ क्या था।
फैबियो मोरा

51
@ सालाठे, मुझे नहीं मिला। मुहावरेदार और रेगेक्स-आधारित समाधान दोनों प्रस्तावित किए गए थे: दक्षता के मामले में दोनों की तुलना करना सबसे अच्छा (फिर से दक्षता के संदर्भ में) उत्तर खोजने में मदद करता है। वह बुराई क्यों है?
cbrandolino

5
@cbrandolino, किसी ने नहीं कहा कि यह बुराई थी । मुझे लगा कि यह पूरी तरह से सवाल के लिए अप्रासंगिक है; बहुत कुछ "यहाँ दो समाधान हैं, और यहाँ कुछ बिल्ली के बच्चे की एक तस्वीर अधिक उत्थान के लिए होगी"।
सलातो

5
if (substr($str, 0, strlen($prefix)) == $prefix) if (0 === strpos($str, $prefix))उसी पठनीयता को बनाए रखते हुए अनावश्यक मेमोरी आवंटन से बचने के लिए बदला जा सकता है :)
xDaizu

63

आप कैरट सिंबल ( ^) के साथ रेग्युलर एक्सप्रेशंस का उपयोग कर सकते हैं जो स्ट्रिंग की शुरुआत में मैच को एंकर करता है:

$str = preg_replace('/^bla_/', '', $str);

मुझे आश्चर्य है कि अगर यह substr()संस्करण की तुलना में तेजी से काम करता है ... मुझे लगता है कि यह करता है, और उचित उत्तर के रूप में चिह्नित किया जाना चाहिए।
फ्लैश थंडर

सिवाय इसके कि preg_quote
बजे

मुझे लगता है कि यह एक प्रोग्रामर की आंखों के लिए बहुत कम दर्दनाक है और अधिक सहज है। यहां तक ​​कि अगर यह दूसरे सुझाए गए समाधान के प्रदर्शन में हार जाता है (जो मुझे वास्तव में संदेह है), तो मैं अभी भी इसे पसंद करूंगा।
Fr0zenFyr

multibyteदुःस्वप्न अन्य समाधानों के साथ एक और मुद्दा है जबकि यह अच्छी तरह से काम करता है यदि फ़ाइल की एन्कोडिंग सही है। वैसे भी, यह इस सवाल के दायरे में नहीं होना चाहिए ताकि मुझे परवाह न हो।
Fr0zenFyr

यह उल्लेख करने के लिए वापस आया कि यह विषय स्ट्रिंग्स की एक सरणी के साथ काम करने का एक अतिरिक्त लाभ है। substrऔर strposएक सरणी स्वीकार नहीं कर सकते। अगर आप किसी ऐरे से काम कर रहे हैं, तो आप निश्चित प्रदर्शन हासिल करते हैं। चीयर्स!
Fr0zenFyr

20
function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}

10
.''जरूरत नहीं है।
नैट्स

1
हर एक के लिए यहां से जो माइक्रो-ऑप्टिमाइज़िंग लगता है, उसके लिए यह मूल्य है, यह मेरी गिनती से लगातार सबसे तेज़ है। 1 मिलियन पुनरावृत्तियाँ .17 सेकंड में आईं, जबकि (substr($str, 0, strlen($prefix)) == $prefix)स्वीकृत उत्तर से अधिक पसंद किया गया ।37
बिलीनो

5

यहाँ।

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);

2
उपाय 0.0000459153 सेकंड :)
फैबियो मोरा

अच्छी गति, लेकिन इसके साथ समाप्त होने वाली सुई पर निर्भर होने के लिए यह कठिन-कोडित है _। क्या कोई सामान्य संस्करण है?
toddmo

0

मुझे लगता है कि substr_replace आप क्या चाहते हैं, जहां आप अपनी स्ट्रिंग के भाग के लिए अपनी जगह को सीमित कर सकते हैं: http://nl3.php.net/manual/en/function.substr-replace.php (यह आपको केवल देखने के लिए सक्षम करेगा) स्ट्रिंग की शुरुआत।)

आप str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ) की गणना पैरामीटर का उपयोग कर सकते हैं , यह आपको बाईं ओर से शुरू होने वाले प्रतिस्थापन की संख्या को सीमित करने की अनुमति देगा, लेकिन यह इसे शुरू में लागू नहीं किया जाएगा।


1
substr_replaceदिए गए रेंज में वर्णों को प्रतिस्थापित करेगा चाहे वे उपसर्ग हों जिन्हें आप हटाना चाहते हैं या कुछ और। ओपी bla_"केवल तभी निकालना चाहता है जब वह स्ट्रिंग की शुरुआत में पाया जाता है।"
ओलिवियर 'एल्बाउम' शॉलर

0

अच्छी गति है, लेकिन यह _ के साथ समाप्त होने वाली सुई पर निर्भर करने के लिए कठिन-कोडित है। क्या कोई सामान्य संस्करण है? - टोडरमो जून 29 को 23:26 पर

एक सामान्य संस्करण:

$parts = explode($start, $full, 2);
if ($parts[0] === '') {
    $end = $parts[1];
} else {
    $fail = true;
}

कुछ बेंचमार्क:

<?php

$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';

$fail = false;

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    if (strpos($full, $start) === 0) {
        $end = substr($full, strlen($start));
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    $parts = explode($start, $full, 2);
    if ($parts[0] === '') {
        $end = $parts[1];
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);

मेरे काफी पुराने होम पीसी पर:

$ php bench.php

आउटपुट:

   strpos+strlen : 0.158388 s
         explode : 0.126772 s

0

यहाँ एक और भी तेज़ तरीका है:

// strpos is faster than an unnecessary substr() and is built just for that 
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));

0

यह जहाँ भी पाया जाता है, पहले, शुरू या मध्य या अंत में पहले मैच को हटा देगा।

$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));


-6

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

अब तुम क्या चाहते हो

$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);

7
str_replace()समारोह के $countपैरामीटर एक चर संदर्भ द्वारा पारित प्रतिस्थापन की संख्या मिला, जिसमें होने की उम्मीद है, प्रतिस्थापन की संख्या सीमित न।
एक्स

-6

निकालें www। स्ट्रिंग की शुरुआत से, यह सबसे आसान तरीका है (ltrim)

$a="www.google.com";
echo ltrim($a, "www.");

8
दूसरा पैरामीटर स्ट्रिंग के बाईं ओर से हटाए जाने वाले वर्णों का एक मानचित्र है ( php.net/manual/function.ltrim.php )। इसलिए: ltrim($a, "w.");कार्य केवल तभी करेगा जब डोमेन "w" से शुरू नहीं होगा। ltrim ('m.google.com', ".omg")में परिणाम le.com
खंड

लेकिन यह प्रश्न की विशिष्ट समस्या को हल करता है, +1
चूलियन

1
यह वास्तव में उनके उत्तर के लिए बनाई गई विशिष्ट समस्या को हल करता है - प्रश्न की समस्या नहीं। यहां तक ​​कि अगर तुम साथ जाना होगा ltrim, यह गलत तरीके से उपयोग किया जाता है। दूसरा पैरामीटर वर्णों की एक सूची है जिसे ट्रिम किया जाना चाहिए; इसलिए एक एकल "w."पर्याप्त होगा।
खंडित किया गया

मुझे लगता है, IMHO, यह सवाल के लिए और समस्या के लिए सही है।
abkrim

2
कई परीक्षणों के साथ परीक्षण के बाद मेरी राय बदल जाती है .... किसी भी स्थिति पर सवाल के लिए काम नहीं करते हैं
abkrim
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.