2010-02-07 16 views
6

के साथ एकाधिक स्लैश को प्रतिस्थापित करें यह हल करने में एक आसान समस्या की तरह लगता है, लेकिन ऐसा लगता है कि यह उतना आसान नहीं है। मेरे पास PHP में यह स्ट्रिंग है:नियमित अभिव्यक्ति, केवल एक

////%postname%/ 

यह एक यूआरएल है और मैं कभी भी एक से अधिक स्लैश नहीं चाहता हूं। मैं कभी भी स्लेश को पूरी तरह से हटाना नहीं चाहता हूं।

/%postname%/ 

क्योंकि संरचना दिखाई दे सकता है अलग मैं एक चतुर preg regexp की जगह, मुझे लगता है की जरूरत है:

यह की तरह दिखना चाहिए कैसे है। यह इस तरह यूआरएल के साथ काम करने की जरूरत:

////%postname%//mytest/test///testing 

जो इस के लिए परिवर्तित किया जाना चाहिए:

/%postname%/mytest/test/testing 

उत्तर

16

ये रहा:

$str = preg_replace('~/+~', '/', $str); 

या:

$str = preg_replace('~//+~', '/', $str); 

या यहां तक ​​कि:

$str = preg_replace('~/{2,}~', '/', $str); 

एक साधारण str_replace() (अगर कोई लगातार दो से अधिक स्लैश हैं) भी चाल करना होगा:

$str = str_replace('//', '/', $str); 
+0

बहुत कम उम्मीद से। मैं इसे असफल नहीं कर सका। धन्यवाद! –

+4

str_replace इस तरह नहीं होगा। मुझे विश्वास है कि आपको एक रिकर्सिव फ़ंक्शन चाहिए। (नीचे एक नज़र डालें) – Gal

+1

जैसा कि गैल कहता है, यदि दो से अधिक स्लेश हैं तो str_replace काम नहीं करेगा। Preg_replace काम करेगा लेकिन बार्ट के संस्करण बेहतर है क्योंकि यह सिंगल स्लेश से मेल नहीं खाता है, केवल दो या अधिक – meouw

4

प्रयास करें:

echo preg_replace('#/{2,}#', '/', '////%postname%//mytest/test///testing'); 
0
echo str_replace('//', '/', $str); 
+0

नहीं, यह ''/////'' '// '' के साथ बदल देगा 'जबकि एक स्लैश की आवश्यकता है। –

4
function drop_multiple_slashes($str) 
{ 
    if(strpos($str,'//')!==false) 
    { 
    return drop_multiple_slashes(str_replace('//','/',$str)); 
    } 
    return $str; 
} 

उपयोग कर रहा है कि str_replace

+2

यह तब तक काम नहीं करेगा जब तक कि आप _! == 0_ _ _ == false_ को बदल नहीं देते। इसके अलावा, रिकर्सन की कोई आवश्यकता नहीं है: _while (स्ट्रॉप्स ($ str, '//')! == false) {$ str = str_replace ('//', '/', $ str); } $ str वापस लौटें; _ – GZipp

+0

@GZipp, आप सही हैं, मैंने इसे संपादित किया है। जहां तक ​​मुझे पता है, रिकर्सिव फ़ंक्शन और लूप के दौरान प्रदर्शन में कोई अंतर नहीं है (लेकिन मैं खुशी से अन्यथा साबित हो सकता हूं)। – Gal

3

देर से लेकिन इन सभी विधियों को http:// भी हटा देगा, लेकिन यह भी।

function to_single_slashes($input) { 
    return preg_replace('~(^|[^:])//+~', '\\1/', $input); 
} 

# out: http://localhost/lorem-ipsum/123/456/ 
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/'); 
0

मेरे समाधान:

while (strlen($uri) > 1 && $uri[0] === '/' && $uri[1] === '/') { 
    $uri = substr($uri, 1); 
} 
संबंधित मुद्दे