2011-11-01 11 views
11

की निर्देशिका और फ़ाइल नामों को मुझे PHP का उपयोग कर यूआरएल एन्कोड करने के लिए यूआरएल एन्कोड करना होगा।urlencode केवल यूआरएल

तो मैं http://example.com/file name जैसे कुछ एन्कोड करना चाहता हूं और इसके परिणामस्वरूप http://example.com/file%20name है।

बेशक, अगर मैं urlencode('http://example.com/file name'); करता हूं तो मैं http%3A%2F%2Fexample.com%2Ffile+name के साथ समाप्त होता हूं।

स्पष्ट (मेरे लिए, वैसे भी) समाधान यूआरएल को स्कीम, होस्ट इत्यादि में विभाजित करने के लिए parse_url() का उपयोग करना है और फिर केवल urlencode() भागों को पथ की आवश्यकता है। फिर, मैं http_build_url() का उपयोग कर यूआरएल को फिर से इकट्ठा करूंगा।

क्या इससे कहीं अधिक सुरुचिपूर्ण समाधान है? या वह मूल रूप से जाने का रास्ता है?

+0

यही मेरे लिए सबसे मजबूत समाधान की तरह लगता है। – Herbert

+0

प्रति दस्तावेज: urlencode एक यूआरएल के क्वेरी भाग के लिए है। पथ के लिए rawurlencode, लेकिन slashes को बाहर करने के लिए सुनिश्चित करें। –

उत्तर

15

@deceze निश्चित रूप से मिला है मुझे जा रहा सही रास्ते से नीचे, तो उसका जवाब ऊपर उठाओ। लेकिन यहाँ ठीक है कि क्या सफल:

$encoded_url = preg_replace_callback('#://([^/]+)/([^?]+)#', function ($match) { 
       return '://' . $match[1] . '/' . join('/', array_map('rawurlencode', explode('/', $match[2]))); 
      }, $unencoded_url); 

कुछ चीजें दिये गये हैं:

  • http_build_url एक PECL तो स्थापित करता है, तो आप दूसरों के लिए अपने कोड का वितरण कर रहे है (जैसा कि मैं इस मामले में कर रहा हूँ की आवश्यकता है) हो सकता है कि आप इससे बचें और reg exp parsing के साथ चिपके रहें जैसे मैंने यहां किया था (@ धोखे के जवाब से भारी चोरी करना - फिर, उस चीज़ को ऊपर उठाएं)।

  • urlencode() जाने का कोई तरीका नहीं है! पथ के लिए आपको rawurlencode() की आवश्यकता है ताकि रिक्त स्थान %20 के रूप में एन्कोड किए जाएं और + नहीं। + के रूप में एन्कोडिंग रिक्त स्थान क्वेरी स्ट्रिंग के लिए ठीक है, लेकिन पथों के लिए इतना गर्म नहीं है।

  • यह उन यूआरएल के लिए काम नहीं करेगा जिन्हें उपयोगकर्ता नाम/पासवर्ड एन्कोडेड की आवश्यकता है। मेरे उपयोग के मामले में, मुझे नहीं लगता कि मैं उन लोगों की परवाह करता हूं, इसलिए मुझे चिंता नहीं है। लेकिन यदि आपका उपयोग मामला उस संबंध में अलग है, तो आपको इसका ख्याल रखना होगा।

+0

ठीक है, मैं फिर से एक साथ पूर्ण यूआरएल टुकड़ा भूल गया। मुझे लगता है कि कोई भी रेगेक्स को गैर-कैप्चरिंग लुक-बैक करने के लिए बदल सकता है, इसलिए यह केवल पथ को निष्कासित और संशोधित करता है। वैसे भी +1। :) – deceze

14

आप कहते हैं, इन पंक्तियों के साथ कुछ यह करना चाहिए:

$parts = parse_url($url); 
if (!empty($parts['path'])) { 
    $parts['path'] = join('/', array_map('rawurlencode', explode('/', $parts['path']))); 
} 
$url = http_build_url($parts); 

या संभवतः:

$url = preg_replace_callback('#https?://.+/([^?]+)#', function ($match) { 
      return join('/', array_map('rawurlencode', explode('/', $match[1]))); 
     }, $url); 

(Regex पूरी तरह से हालांकि परीक्षण नहीं)

+0

+1 यह समझने के लिए कि पथ में स्लेश सबकुछ खराब हो जाएंगे यदि उन्हें आपके जैसे विशेष हैंडलिंग नहीं दिए जाते हैं। – Trott

+0

अच्छा। Regexp को कुछ tweaking की जरूरत है, लेकिन यह मुझे सही रास्ते नीचे सेट। – Trott

+0

मैं 'urlencode' को' rawurlencode' के साथ बदल दूंगा। – kayue

-1

मुझे लगता है कि इस समारोह ठीक:

function newUrlEncode ($url) { 
    return str_replace(array('%3A', '%2F'), '/', urlencode($url)); 
} 
+0

यह प्रश्न में उदाहरण के लिए काम करता है, लेकिन यह मजबूत नहीं है। उदाहरण के लिए, यदि URL में पोर्ट निर्दिष्ट है तो यह गलत परिणाम देता है। – Trott

-1

बहुत सरल:

$encoded = implode("/", array_map("rawurlencode", explode("/", $path))); 
+1

कृपया अपने उत्तर की व्याख्या करें क्योंकि यह एक पुराना प्रश्न है, यह अनुशंसा की जाती है कि आप हमें बताएं कि आपका उत्तर पहले से प्रदान किए गए दूसरों से अलग कैसे है। धन्यवाद। –

+0

यह उत्तर गलत है। यह योजना का पालन करने वाले कोलन को एन्कोड करेगा। इनपुट 'http://example.com/file name' को देखते हुए, यह 'http% 3A // example.com/file% 20name' उत्पन्न करता है। सही परिणाम 'http: // example.com/file% 20name' है। – Trott

1
function encode_uri($url){ 
    $exp = "{[^0-9a-z_.!~*'();,/?:@&=+$#%\[\]-]}i"; 
    return preg_replace_callback($exp, function($m){ 
     return sprintf('%%%02X',ord($m[0])); 
    }, $url); 
} 
संबंधित मुद्दे