2010-10-24 10 views
5

वेब चौखटे "मल" जो पठनीय और एसईओ के अनुकूल URL बनाने के लिए उपयोग किया जाता है के लिए निर्मित समर्थन किया है:मैं पर्ल में यूआरएल स्लग कैसे उत्पन्न कर सकता हूं? इस तरह के रेल और Django के रूप में

एक स्लग स्ट्रिंग आम तौर पर केवल a-z, 0-9 और - वर्णों में से एक होता है और इसलिए यूआरएल-एस्केपिंग के बिना लिखा जा सकता है (लगता है "foo% 20bar")।

मैं एक पर्ल स्लग समारोह है कि किसी भी वैध यूनिकोड स्ट्रिंग एक स्लग प्रतिनिधित्व (a-z, 0-9 और -) वापस आ जाएगी दिया की तलाश में हूँ।

$input = lc($input), 
$input =~ s/[^a-z0-9-]//g; 

हालांकि, इस कार्यान्वयन को संभाल नहीं होगा अंतर्राष्ट्रीयकरण और लहजे (मैं ë चाहते e बनने के लिए):

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

मेरा प्रश्न:

  • सबसे सामान्य/व्यावहारिक तरीका पर्ल में Django/रेल प्रकार मल उत्पन्न करने के लिए क्या है?This यह है कि मैंने जावा में एक ही समस्या का समाधान कैसे किया।
+0

ऐसा ही करें जैसा आपने जावा में किया था। क्या कोई विशेष ऑपरेशन है जिसे आप नहीं जानते कि अनुवाद कैसे करें? –

+0

ब्रायन: हां, ऑपरेशन मुझे नहीं पता था कि अनुवाद कैसे किया जाए "स्ट्रिंग सामान्यीकृत = Normalizer.normalize (nowhitespace, Form.NFD);"। यूनिकोड :: सामान्यीकृत इसे हल करें। कैमरून का जवाब देखें। – knorv

उत्तर

11

slugify filter वर्तमान में Django में प्रयोग किया जाता तब्दील (मोटे तौर पर) के बाद पर्ल कोड के लिए:

use Unicode::Normalize; 

sub slugify($) { 
    my ($input) = @_; 

    $input = NFKD($input);   # Normalize (decompose) the Unicode string 
    $input =~ tr/\000-\177//cd; # Strip non-ASCII characters (>127) 
    $input =~ s/[^\w\s-]//g;  # Remove all characters that are not word characters (includes _), spaces, or hyphens 
    $input =~ s/^\s+|\s+$//g;  # Trim whitespace from both ends 
    $input = lc($input); 
    $input =~ s/[-\s]+/-/g;  # Replace all occurrences of spaces and hyphens with a single hyphen 

    return $input; 
} 

जब से तुम भी, कमज़ोर लोगों के उच्चारण वर्ण बदलने के लिए unidecode के लिए एक कॉल में फेंक चाहते हैं (Text::Unidecode में परिभाषित) गैर-ASCII वर्णों को अलग करने से पहले आपका सबसे अच्छा शर्त लगता है (as pointed out by phaylon)। अच्छी तरह से तार कि मुख्य रूप से ASCII हैं के लिए

use Unicode::Normalize; 
use Text::Unidecode; 

sub slugify_unidecode($) { 
    my ($input) = @_; 

    $input = NFC($input);   # Normalize (recompose) the Unicode string 
    $input = unidecode($input); # Convert non-ASCII characters to closest equivalents 
    $input =~ s/[^\w\s-]//g;  # Remove all characters that are not word characters (includes _), spaces, or hyphens 
    $input =~ s/^\s+|\s+$//g;  # Trim whitespace from both ends 
    $input = lc($input); 
    $input =~ s/[-\s]+/-/g;  # Replace all occurrences of spaces and hyphens with a single hyphen 

    return $input; 
} 

पूर्व काम करता है, लेकिन कम पड़ता है जब पूरी स्ट्रिंग गैर- ASCII वर्ण का गठन होता है, क्योंकि वे सब:

उस मामले में, समारोह की तरह लग सकता है एक खाली स्ट्रिंग के साथ छोड़कर, बाहर निकल जाओ।

नमूना उत्पादन:

string  | slugify  | slugify_unidecode 
------------------------------------------------- 
hello world  hello world  hello world 
北亰       bei-jing 
liberté   liberta   liberte 

नोट कैसे 北 亰 Django से प्रेरित कार्यान्वयन के साथ कुछ भी नहीं करने के लिए slugifies हो जाता है। ध्यान दें कि एनएफसी सामान्यीकरण में अंतर भी है - विघटित चरित्र के दूसरे भाग को अलग करने के बाद स्वतंत्रता एनएफकेडी के साथ 'स्वतंत्रता' बन जाती है, लेकिन एनएफसी के साथ फिर से इकट्ठा 'ए' को अलग करने के बाद 'स्वतंत्रता' बन जाएगी।

1

श्रृंखला की शुरुआत करने के लिए जोड़ा जा रहा है Text::Unaccent लगता है कि यह तुम क्या चाहते हो जाएगा।

3

String::Dirify ब्लॉगिंग सॉफ्टवेयर मूवबल टाइप/मेलोडी में स्लग बनाने के लिए उपयोग किया जाता है।

+0

क्या यह यूनिकोड या सिर्फ आईएसओ -885 9 करता है? – MkV

+0

255 से अधिक कोडपॉइंट्स छूटे हुए हैं। – daxim

+0

कुछ चीनी के साथ परीक्षण किया गया, ऐसा लगता है कि मुझे क्या चाहिए। – Weiyan

0

सबसे टर्न-कुंजी समाधान Text::Slugify का उपयोग कर रहा है जो आपको चाहिए। यह कोड की एक छोटी राशि है जो अच्छी तरह से आपके लिए slugify फ़ंक्शन प्रदान करती है।

यह वर्णों से उच्चारण हटाने के लिए Text::Unaccent::PurePerl पर निर्भर करता है।

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