PHP प्रतिस्थापन निष्कर्षण। पहले '/' या पूरे स्ट्रिंग से पहले स्ट्रिंग प्राप्त करें


170

मैं एक विकल्प निकालने की कोशिश कर रहा हूं। मुझे इसे PHP में करने में कुछ मदद चाहिए।

यहां कुछ नमूना तार दिए गए हैं जिनके साथ मैं काम कर रहा हूं और मुझे जिन परिणामों की आवश्यकता है:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

मैं पहले तक स्ट्रिंग प्राप्त करना चाहता हूं /, लेकिन अगर कोई /मौजूद नहीं है, तो पूरी स्ट्रिंग प्राप्त करें।

मैंने कोशिश की,

substr($mystring, 0, strpos($mystring, '/'))

मुझे लगता है कि यह कहता है - की स्थिति प्राप्त करें /और फिर स्थिति 0 से उस स्थान पर प्रतिस्थापन प्राप्त करें ।

मुझे नहीं पता कि इस मामले को कैसे संभालना है, जहां कोई बात नहीं है /, बयान को बहुत बड़ा किए बिना।

क्या PHP स्टेटमेंट को बहुत जटिल किए बिना उस मामले को संभालने का एक तरीका भी है?


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

जवाबों:


261

उपयोग explode()

$arr = explode("/", $string, 2);
$first = $arr[0];

इस मामले में, मैं limitपैरामीटर का उपयोग कर रहा हूं explodeताकि php किसी भी जरूरत से ज्यादा स्ट्रिंग को स्कैन नहीं करेगा।


2
+1 जवाब के लिए धन्यवाद। यह काम किया :) लेकिन एक सवाल। मैं केवल ऐसा करने में सक्षम हूं -> $arr = explode('/',$mystring,2); echo $arr[0];। मैं एक स्टेटमेंट में पहला स्ट्रिंग प्राप्त करने में असमर्थ हूं - echo explode('/',$mystring,2)[0];। चूंकि विस्फोट एक सरणी देता है, मुझे इसे सही करने में सक्षम होना चाहिए? लेकिन मुझे एक त्रुटि मिलती है। कोई सुझाव?

1
Php आपको फ़ंक्शन से रिटर्न वैल्यू में इंडेक्सिंग पसंद नहीं करता है।
gnud

3
ओह। ठीक है। अगर यह संभव होता तो अच्छा होता।

36
explode() + [0]लिखने का एक लंबा-चौड़ा तरीका हैstrtok($string, "/")
mario

5
वैसे, आप विस्फोट कर सकते हैं ("/", $ स्ट्रिंग, 2) [0] php में 5.5
बिलीन्हो

293

सबसे कारगर उपाय है strtokसमारोह:

strtok($mystring, '/')

उदाहरण के लिए:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

तथा

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home

25
यह भी current-explodeसमाधान से लगभग 40% तेज है । (ऐसा नहीं है कि मैं इसे इतनी बार उपयोग करता हूं कि यह मायने रखता है।)
टॉर

5
यह सुरुचिपूर्ण और तेज़ है - स्वीकृत उत्तर होना चाहिए।
कोस्टा कोंटोस

5
यह अपवादित उत्तर होना चाहिए। निश्चित रूप से तेज और अधिक मेमोरी और सीपीयू चक्र कुशल तो explodeदिए गए किसी भी समाधान।
शिवम माहेश्वरी

के साथ समस्या यह strtokहै first/secondवापस आ जाएगी firstलेकिन /secondवापस आ जाएगी secondएक खाली स्ट्रिंग के बजाय।
rybo111

मेरी उपरोक्त टिप्पणी के आगे: जब एक खाली भाग को PHP 4.1.0 के साथ बदला गया, तो व्यवहार। पुराने व्यवहार ने एक खाली स्ट्रिंग लौटा दी, जबकि नया, सही, व्यवहार बस स्ट्रिंग के भाग को छोड़ देता है
rybo111

95
$first = explode("/", $string)[0];

2
सुरुचिपूर्ण, लेकिन कंप्यूटर के समय में बहुत कुशल नहीं है। लेकिन इन दिनों लोग
डेनिस

13

इस बारे में क्या :

substr($mystring.'/', 0, strpos($mystring, '/'))

बस रहस्य के अंत में एक '/' जोड़ें ताकि आप सुनिश्चित कर सकें कि कम से कम एक है;)


आप यह जांच कर सकते हैं कि ऐसा करने से पहले स्ट्रिंग में एक स्लैश है या नहीं। वैसे भी, यह सबसे सरल उपाय है।
गुइलहर्मे संपाओ

12

स्वीकृत उत्तर का एक-पंक्ति संस्करण:

$out=explode("/", $mystring, 2)[0];

Php 5.4+ में काम करना चाहिए


1
नीचे दिए गए एक के विपरीत, "2" इसे बनाने वाले सरणी आइटम की संख्या को सीमित करता है। अच्छी सोच।
सीए

9

यह शायद सबसे छोटा उदाहरण है जो मेरे दिमाग में आया:

list($first) = explode("/", $mystring);

1) list()स्वचालित रूप से स्ट्रिंग असाइन करेगा जब तक "/"कि अगर सीमांकक
2 "/"नहीं मिला है ) यदि सीमांकक नहीं मिला है, तो पूरे स्ट्रिंग को सौंपा जाएगा

... और यदि आप वास्तव में प्रदर्शन से ग्रस्त हैं, तो आप विस्फोट के लिए अतिरिक्त पैरामीटर जोड़ सकते हैं explode("/", $mystring, 2)जो लौटे तत्वों की अधिकतम सीमा है।


2
मुझे यह तरीका पसंद है। अनावश्यक सरणी बनाता है। और strtok()असुरक्षित है।
rybo111

1
@ rybo111: असुरक्षित क्या है strtok()?
हकरे

@ rybo111 I इको हैकर की भावना; क्या strtok()असुरक्षित बनाता है ?
डॉकटोर जे।

@ झक्रे के जवाब के लिए मेरे जवाब देखें। यह PHP संस्करण के आधार पर अप्रत्याशित व्यवहार का कारण बन सकता है।
रयबो111

php 4.1.0 - रैली?
हकरे

8

कभी नहीं से देर भली। उसके लिए php का एक पूर्वनिर्धारित कार्य है। यहाँ यह अच्छा तरीका है।

strstr

यदि आप मैच से पहले भाग प्राप्त करना चाहते हैं, तो बस http://_pp.net/manual/en/function.strstr.php से पहले __eedle (3rd पैरामीटर) सेट true करें

function not_strtok($string, $delimiter)
{    
    $buffer = strstr($string, $delimiter, true);

    if (false === $buffer) {
        return $string;
    }

    return $buffer;
}

var_dump(
    not_strtok('st/art/page', '/')
);

यह उपयोग करने के लिए सुरक्षित नहीं है यदि आप सुनिश्चित नहीं कर सकते हैं कि सुई स्ट्रिंग में मौजूद है।
फफूंदी

@fooquency - यह सच है, लेकिन आप हमेशा उस स्ट्रिंग के अंत में चरित्र जोड़ सकते हैं जिसे आप जाँच रहे हैं, बस सुनिश्चित करने के लिए।
माइकस्किंकल

धन्यवाद। मेरे परीक्षणों से पता चला है कि strstrकी तुलना में थोड़ा तेज है strtok। मैं पूर्व के साथ जाऊंगा।
इयान वाई।

5

PHP 5.3 में फ़ंक्शन स्ट्रैस () को यह काम करना चाहिए .. हालांकि तीसरा पैरामीटर सही पर सेट होना चाहिए।

लेकिन अगर आप 5.3 का उपयोग नहीं कर रहे हैं, तो नीचे दिए गए फ़ंक्शन को सही ढंग से काम करना चाहिए:

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

मैंने इसका परीक्षण नहीं किया है, लेकिन यह ठीक काम करना चाहिए .. और यह बहुत तेज़ है


3
+1 के लिए strstr(), लेकिन ध्यान रखें कि falseयदि स्ट्रिंग समाहित नहीं है $needle, तो यह वापस आ जाता है , इस प्रकार explode()ऊपर दिए गए समाधान इस मामले में बेहतर हैं।
बेंजामिन

3

आप उसकी देखभाल करने के लिए एक सहायक समारोह बना सकते हैं:

/**
 * Return string before needle if it exists.
 *
 * @param string $str
 * @param mixed $needle
 * @return string
 */
function str_before($str, $needle)
{
    $pos = strpos($str, $needle);

    return ($pos !== false) ? substr($str, 0, $pos) : $str;
}

यहाँ एक उपयोग मामला है:

$sing = 'My name is Luka. I live on the second floor.';

echo str_before($sing, '.'); // My name is Luka

3

आप इस तरह एक regex का उपयोग करने की कोशिश कर सकते हैं:

$s = preg_replace('|/.*$|', '', $s);

कभी-कभी, रेगेक्स हालांकि धीमा होता है, इसलिए यदि प्रदर्शन एक मुद्दा है, तो इसे ठीक से बेंचमार्क करना सुनिश्चित करें और यदि यह आपके लिए अधिक उपयुक्त है तो सब्सट्रिंग के साथ अन्य विकल्प का उपयोग करें।


2
रेगेक्स शायद ओवरकिल भी है, लेकिन जब से मैं explodeइसके बारे में कहता हूं, यह देखना दिलचस्प होगा कि कौन सा तेज है।
rvighne

1
इसमें कुछ भी गलत नहीं है और मैं यह नहीं सोच सकता कि यह 2 डाउनवोट के लायक क्यों होगा। मैं व्यक्तिगत रूप से रेगेक्स का उपयोग नहीं करूंगा लेकिन यह निश्चित रूप से गलत नहीं है।
billynoah

2

का उपयोग currentपर explodeप्रक्रिया को आसान होगा।

 $str = current(explode("/", $str, 2));

0
$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));

0

आप इस एक लाइन समाधान का उपयोग भी कर सकते हैं

list($substring) = explode("/", $string);

-1

मुझे लगता है कि यह काम करना चाहिए?

substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));

आपका फ़ंक्शन हमेशा पहले चार को लौटाएगा क्योंकि आप कर रहे हैं (स्ट्रैप्स ($ मिस्ट्रिंग, '/')! == गलत) इससे पहले कि आप इसे $ पीओएस पर असाइन करें, आपको ए ($ पॉस = स्ट्रैप्स ($ फर्स्टकॉलेनेम) करने की आवश्यकता है '_'))! == मिथ्या)। यह 1 लाइनर लड़का होगा जिसने सवाल पोस्ट किया है।
मिहाई पी।

-1

क्यों नहीं उपयोग करें:

function getwhatiwant($s)
{
    $delimiter='/';
    $x=strstr($s,$delimiter,true);
    return ($x?$x:$s);
}

या:

   function getwhatiwant($s)
   {
       $delimiter='/';
       $t=explode($delimiter, $s);
       return ($t[1]?$t[0]:$s);
   }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.