2008-09-01 13 views
26

मैं सी # में एक दोस्ताना यूआरएल उत्पन्न करने के बारे में कैसे जा सकता हूं? वर्तमान में मैं अंडरस्कोर के साथ रिक्त स्थान को सरल करता हूं, लेकिन मैं यूआरएल की तरह स्टैक ओवरफ्लो उत्पन्न करने के बारे में कैसे जाउंगा?मैं सी # में एक दोस्ताना यूआरएल कैसे उत्पन्न करूं?

उदाहरण के लिए मैं कैसे परिवर्तित कर सकते हैं:

मैं सी # में एक अनुकूल URL कैसे बनाऊँ?

में कैसे करते हैं-ए-उत्पन्न-एक के अनुकूल-यूआरएल-इन-सी

उत्तर

46

हालांकि कई चीजें हैं जिन्हें जेफ के समाधान में सुधार किया जा सकता है।

if (String.IsNullOrEmpty(title)) return ""; 

आईएमएचओ, इसका परीक्षण करने के लिए जगह नहीं है। यदि फ़ंक्शन एक खाली स्ट्रिंग पास हो जाता है, तो कुछ भी गंभीर रूप से गलत हो जाता है। एक त्रुटि फेंको या बिल्कुल प्रतिक्रिया मत करो।

// remove any leading or trailing spaces left over 
… muuuch later: 
// remove trailing dash, if there is one 

काम दो बार। यह मानते हुए कि प्रत्येक ऑपरेशन एक पूरी नई स्ट्रिंग बनाता है, यह खराब है, भले ही प्रदर्शन कोई मुद्दा न हो।

// replace spaces with single dash 
title = Regex.Replace(title, @"\s+", "-"); 
// if we end up with multiple dashes, collapse to single dash    
title = Regex.Replace(title, @"\-{2,}", "-"); 

फिर, मूल रूप से दो बार काम: सबसे पहले, एकाधिक रिक्त स्थान को एक साथ बदलने के लिए रेगेक्स का उपयोग करें। फिर, एक साथ कई डैश को प्रतिस्थापित करने के लिए फिर से regex का उपयोग करें। दो अभिव्यक्तियों को पार्स करने के लिए, स्मृति में निर्माण करने के लिए दो ऑटोमाटा, स्ट्रिंग पर दो बार पुनरावृत्ति करें, दो स्ट्रिंग बनाएं: इन सभी परिचालनों को एक ही पर ध्वस्त किया जा सकता है।

// make it all lower case 
title = title.ToLower(); 
// remove entities 
title = Regex.Replace(title, @"&\w+;", ""); 
// remove anything that is not letters, numbers, dash, or space 
title = Regex.Replace(title, @"[^a-z0-9\-\s]", ""); 
// replace spaces 
title = title.Replace(' ', '-'); 
// collapse dashes 
title = Regex.Replace(title, @"-{2,}", "-"); 
// trim excessive dashes at the beginning 
title = title.TrimStart(new [] {'-'}); 
// if it's too long, clip it 
if (title.Length > 80) 
    title = title.Substring(0, 79); 
// remove trailing dashes 
title = title.TrimEnd(new [] {'-'}); 
return title; 

सूचना है कि इस विधि स्ट्रिंग कार्यों जब भी संभव हो के बजाय स्ट्रिंग कार्यों regex कार्य करता है और चार कार्यों के बजाय का उपयोग करता है:

मेरे सिर के ऊपर बंद, किसी भी परीक्षण के बिना, इस एक बराबर समाधान होगा ।

+1

ग्रेट उत्तर धन्यवाद, मैंने यूआरएल = Regex.Replace भी जोड़ा (यूआरएल, @ "<(.|\n)*?>", ""); HTML टैग को "मेरे आलेख" के रूप में हटाने के लिए "मेरे-बार्टिकलब-यहां" चालू हो जाएगा –

+0

एक पथ भी अवधि के साथ समाप्त नहीं हो सकता है। यह भी सुनिश्चित नहीं है कि आप नए [] {'-'} का उपयोग क्यों करते हैं, जब आप केवल '-' का उपयोग कर सकते हैं। –

18

यहाँ कैसे हम यह कर रहे हैं। नोट शायद और अधिक बढ़त की स्थिति की तुलना में आप पहली नजर में पता ही देखते हैं कि ..

if (String.IsNullOrEmpty(title)) return ""; 

// remove entities 
title = Regex.Replace(title, @"&\w+;", ""); 
// remove anything that is not letters, numbers, dash, or space 
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", ""); 
// remove any leading or trailing spaces left over 
title = title.Trim(); 
// replace spaces with single dash 
title = Regex.Replace(title, @"\s+", "-"); 
// if we end up with multiple dashes, collapse to single dash    
title = Regex.Replace(title, @"\-{2,}", "-"); 
// make it all lower case 
title = title.ToLower(); 
// if it's too long, clip it 
if (title.Length > 80) 
    title = title.Substring(0, 79); 
// remove trailing dash, if there is one 
if (title.EndsWith("-")) 
    title = title.Substring(0, title.Length - 1); 
return title; 
+8

यह उत्तर पुराना है। जेफ कोड के एक नए संस्करण के साथ अपना मूल उत्तर अपडेट करता है: http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486 # 25486 –

4

इस रास्ते का हिस्सा हो जाता है (मान्य वर्ण की एक श्वेत सूची का उपयोग कर):

new Regex("[^a-zA-Z-_]").Replace(s, "-") 

यह करता है, लेकिन , आपको एक स्ट्रिंग देता है जो "-" के साथ समाप्त होता है। तो शायद स्ट्रिंग के प्रारंभ/अंत से उन लोगों को ट्रिम करने के लिए एक दूसरा रेगेक्स, और हो सकता है कि किसी भी आंतरिक "-" को "-" में बदल दें।

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