2010-05-12 14 views
51

मैं निम्नलिखित कोड का टुकड़ा है:एक यूआरएल स्ट्रिंग से पोर्ट नंबर निकालने का तरीका

string tmp = String.Format("<SCRIPT FOR='window' EVENT='onload' LANGUAGE='JavaScript'>javascript:window.open('{0}');</SCRIPT>", url); 

ClientScript.RegisterClientScriptBlock(this.GetType(), "NewWindow", tmp); 

इस कोड द्वारा उत्पन्न यूआरएल पोर्ट संख्या में शामिल हैं और मुझे लगता है कि क्योंकि पोर्ट 80 द्वारा किया जाता है क्या हो रहा है वेबसाइट और इस कोड में मैं वेबसाइट की आभासी निर्देशिका से एक पृष्ठ लोड करने की कोशिश कर रहा हूं। इस कोड द्वारा उत्पन्न यूआरएल स्ट्रिंग में पोर्ट नंबर को दबाने के तरीके पर कोई विचार?

+3

आपको उत्तर के स्कोर के नीचे मोटी पर क्लिक करके अपने प्रश्न का सबसे अच्छा जवाब स्वीकार करना चाहिए! –

उत्तर

3
var url = "http://google.com:80/asd?qwe=zxc#asd"; 
var regex = new Regex(@":\d+"); 
var cleanUrl = regex.Replace(url, ""); 

System.Uri के साथ समाधान भी संभव है लेकिन अधिक फुलाया जाएगा।

+0

सभी को प्रतिस्थापित नहीं करता है: xxx घटनाएं कहती हैं कि क्या क्वेरीर्स –

+0

में एक है कि रेगेक्स एक यूआरआई को 'http: //asdf.com: 80/asdf? Ru: 12: 34: 56' जैसे बर्बाद कर देगा। (माना जाता है कि यूआरआई को उचित रूप से एन्कोड किया जाना चाहिए लेकिन आप यह सुनिश्चित नहीं कर सकते हैं कि यह है) –

+0

@ इसाक: आप '@" (? Jens

7

मैं इसके लिए System.Uri का उपयोग करूंगा। मैंने कोशिश की नहीं है, लेकिन यह यह ToString वास्तव में उत्पादन तुम क्या चाहते हो जाएगा लगता है:

var url = new Uri("http://google.com:80/asd?qwe=asdff"); 
var cleanUrl = url.ToString(); 

यदि नहीं, तो आप अपने cleanUrl स्ट्रिंग बनाने के लिए url -members के घटकों को जोड़ सकते हैं।

+4

जो डिफ़ॉल्ट के अलावा बंदरगाहों को नहीं हटाता है। (80, ज्यादातर मामलों में) – Jens

+0

yup, चूक गया "इस विधि द्वारा लौटाई गई स्ट्रिंग में पोर्ट जानकारी नहीं है जब पोर्ट योजना के लिए डिफ़ॉल्ट पोर्ट है।" (http://msdn.microsoft.com/en-us/library/system.uri.tostring.aspx) जब मेरा उत्तर – zerkms

+0

@ जेन्स लिखा था: इसे किसी अन्य बंदरगाह को नहीं हटाया जाना चाहिए। Http 80 के लिए केवल 80 को डिफ़ॉल्ट माना जाना चाहिए। यदि आप किसी पोर्ट को हटाते हैं - तो आपको यूआरएल मिलेगा जो दूसरे संसाधन को इंगित करता है। – zerkms

106

Uri.GetComponents विधि का उपयोग करें। पोर्ट घटक को निकालने के लिए आप अन्य सभी घटक गठबंधन करने के लिए होगा, कुछ की तरह:

var uri = new Uri("http://www.example.com:80/dir/?query=test"); 
var clean = uri.GetComponents(UriComponents.Scheme | 
           UriComponents.Host | 
           UriComponents.PathAndQuery, 
           UriFormat.UriEscaped); 

संपादित करें: मैं एक बेहतर तरीका मिल गया है:

var clean = uri.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Port, 
           UriFormat.UriEscaped); 

UriComponents.AbsoluteUri preservers सभी घटकों, इसलिए & ~UriComponents.Port केवल बंदरगाह को बाहर कर देगा।

+5

नवीनतम संपादन के अनुसार: बुरी तरह से मैं फिर से ऊपर नहीं जा सकता। सुपर-सुरुचिपूर्ण उत्तर ;-) – zerkms

+0

धन्यवाद! आम तौर पर आप बस "या" झंडे-enums, तो मैं लगभग भूल गया है कि आप अन्य bitwise संचालन का उपयोग कर सकते हैं। –

+1

बहुत साफ समाधान, उरी – Gent

1

तुम भी URIBuilder की the properties इस के लिए उपयोग कर सकते हैं, यह एक यूआरएल रास्ता outputting के लिए गुण है आप चाहते हैं

+0

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

+0

कृपया ध्यान दें कि tmp चर की सामग्री है:

1

ठीक है, धन्यवाद मैं यह समझ से बाहर ... KISS सिद्धांत का इस्तेमाल किया ...

string redirectstr = String.Format(
    "http://localhost/Gradebook/AcademicHonestyGrid.aspx?StudentID={0}&ClassSectionId={1}&uid={2}", 
    studid, 
    intSectionID, 
    HttpUtility.UrlEncode(encrypter.Encrypt(uinfo.ToXml()))); 

Response.Redirect(redirectstr); 

क्या मैं जो कर रहा हूँ एक परीक्षण दोहन

53
UriBuilder u1 = new UriBuilder("http://www.example.com:80/dir/?query=test"); 
u1.Port = -1; 
string clean = u1.Uri.ToString(); 

को Port गुण को सेट है के लिए ठीक काम करता हैUriBuilder पर कोई स्पष्ट बंदरगाह हटा देगा और प्रोटोकॉल योजना के लिए डिफ़ॉल्ट पोर्ट मान का स्पष्ट रूप से उपयोग करेगा।

+1

मुझे इस समाधान में 'u1.Port = -1;' छोड़ने में मिला मेरे लिए - हालांकि उपरोक्त में से कोई भी पोर्ट नंबर को भी बाहर कर देगा, न केवल 80, ताकि कुछ मामलों के लिए भी उपयोगी हो। – StormPooper

+1

ध्यान दें कि आप '.bsoluteUri' का उपयोग करना चाहेंगे, नहीं। 'टॉस्ट्रिंग' प्रेजेंट' ps: //stackoverflow.com/a/7624992/29 –

+0

'पोर्ट' को _-1_ सेट करने के बाद 'उरी' को कॉल करने की आवश्यकता नहीं है। इसके बजाए, यह केवल 'स्ट्रिंग क्लीन = u1.ToString(); ' –

24

Ian Flynn idea पर आधारित एक अधिक सामान्य समाधान (http, https, ftp ... के साथ काम करता है)। यह विधि कस्टम पोर्ट, यदि कोई हो, को हटा नहीं देती है। कस्टम पोर्ट प्रोटोकॉल के आधार पर स्वचालित रूप से परिभाषित किया गया है।

var uriBuilder = new UriBuilder("http://www.google.fr/"); 
if (uriBuilder.Uri.IsDefaultPort) 
{ 
    uriBuilder.Port = -1; 
} 
return uriBuilder.Uri.AbsoluteUri; 
+3

पूर्णतावादी हो सकता है;) +1 –

+3

ध्यान दें कि आप' .AbsoluteUri' का उपयोग करना चाहेंगे, नहीं।' ToString' https://stackoverflow.com/a/7624992/29 –

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