javascript - Efficiently replace all accented characters in a string? -


क्लाइंट साइड पर पास -संकलन-सही सॉर्टिंग के एक गरीब आदमी के कार्यान्वयन के लिए मुझे जावास्क्रिप्ट फ़ंक्शन जो स्ट्रिंग में कुशल एकल वर्ण प्रतिस्थापन करता है।

यहां मेरा क्या मतलब है (ध्यान दें कि यह जर्मन पाठ पर लागू होता है, अन्य भाषा अलग तरह से सॉर्ट करता है):

मूल रूप से, मुझे किसी दिए गए स्ट्रिंग के "ä" की सभी घटनाओं की आवश्यकता होती है, जिसमें "पूर्व" मूल सॉर्टिंग गलत हो जाती है: abcouz a ö ü collation-correct होगा: a ä bco ö u ü z

एक "(और इतने पर) इस प्रकार मूल सॉर्टिंग का नतीजा एक यूजर की उम्मीद के मुकाबले काफी करीब होगा (या फिर एक डाटाबेस किस प्रकार लौट जाएगा)।

अन्य भाषाओं में ऐसा करने की सुविधा है:, में,,। लेकिन जावास्क्रिप्ट के बारे में क्या?

यहाँ मेरे पास अभी क्या है।

  // s एक छोटी शॉर्ट स्ट्रिंग होगी (अधिकतम 200/200 वर्णों की तरह, अधिकतम समय के बहुत कम) समारोह makeSortString (ओं) {var अनुवाद: {"ए": "ए", "ओ": "ओ", "यू": "यू", "ए": "ए", "ओ ":" ओ "," यू ":" यू "// संभवत: अधिक आने के लिए}; Var translate_re = / [öäüÖÄÜ] / जी; वापसी (s.replace (translate_re, फ़ंक्शन (मैच) {वापसी अनुवाद [मैच];})); }  

शुरुआत के लिए, मैं यह तथ्य नहीं पसंद करता हूं कि हर बार जब मैं फ़ंक्शन कॉल करता हूं, तब regex को पुनर्निर्माण किया जाता है। मुझे लगता है कि इस संबंध में एक बंद करने में मदद मिल सकती है, लेकिन मुझे किसी कारण से इसे लटका नहीं लगता।

क्या कोई और अधिक कुशल के बारे में सोच सकता है?


नीचे दिए गए उत्तर दो श्रेणियों में आते हैं:

  1. पूर्णता और दक्षता की अलग-अलग डिग्री के स्ट्रिंग प्रतिस्थापन कार्य (जो मैं मूल रूप से पूछ रहा था)
  2. ए, जो व्यापक रूप से समर्थित है जेएस इंजनों के बीच और इस श्रेणी की समस्या को और अधिक सुन्दरता से हल कर सकता है।

टी बात करने के लिए आप विशेष रूप से समारोह के साथ करने की कोशिश कर रहे हैं, लेकिन अगर आप हर बार regex बनाया जा रहा पसंद नहीं है, यहाँ दो समाधान और प्रत्येक के बारे में कुछ चेतावनियां हैं।

यहाँ एक तरीका है ऐसा करने के लिए:

<पूर्व> फ़ंक्शन मेसोर्ट स्ट्रिंग (ओं) {यदि (! MakeSortString.translate_re) makeSortString.translate_re = / [öäüÖÄÜ] / जी; "ए", "ओ": "ए", "यू": "ओ", "यू": "यू", "ए": "ए", "ओ": "ओ", "यू": "यू "// शायद अधिक आने के लिए}; वापसी (s.replace (makeSortString.translate_re, फ़ंक्शन (मैच) {वापसी अनुवाद [मैच];})); }

यह स्पष्ट रूप से फ़ैजल की प्रॉपर्टी की रीजेंक्स को स्वयं बना देगा। केवल एक चीज जिसे आप इस बारे में नहीं पसंद कर सकते हैं (या आप शायद सोचें कि यह निर्भर करता है) यह है कि रिजेक्स अब फ़ंक्शन के शरीर के बाहर संशोधित किया जा सकता है। इसलिए, कोई ऐसा कर सकता है जो आंतरिक रूप से उपयोग किए गए रेगेक्स को संशोधित करता है:

  makeSortString.translate_re = / [a-z] / g;  

तो, उस विकल्प है।

एक बंद करने का एक तरीका है, और इस तरह से किसी को रेगेक्स को संशोधित करने से रोकना, यह एक अनाम समारोह के रूप में परिभाषित करना होगा इस तरह से असाइनमेंट:

  var makeSortString = (फ़ंक्शन () {var translate_re = / [öäüÖÄÜ] / g; रिटर्न फ़ंक्शन (s) {var translate = {"a": "a", "ओ": "ओ", "यू": "यू", "ए": "ए", "ओ": "ओ", "यू": "यू" // शायद अधिक आने के लिए}; .replace (translate_re, फ़ंक्शन (मैच) {वापसी अनुवाद [मैच];}));}}) ();  

उम्मीद है कि यह आपके लिए उपयोगी है।


अद्यतनः यह शुरुआती है और मुझे नहीं पता है कि मैंने पहले स्पष्ट क्यों नहीं देखा, लेकिन यह आप भी अनुवाद वस्तु को बंद करने में भी उपयोगी हो सकते हैं:

  var makeSortString = (function () {var translate_re = / [öäüÖÄÜ] / g; "ए", "ओ": "ए", "यू": "ओ", "यू": "यू", "ए": "ए", "ओ": "ओ", "यू": "यू "// शायद अधिक आने के लिए} वापसी समारोह (रिटर्न) {रिटर्न (अनुवाद।, फ़ंक्शन (मैच) {वापसी अनुवाद [मैच];}));}}) ();  

Comments

Popular posts from this blog

sql - Find last match with latest inserted name in table -

c# - XML serialize base class without knowing derived class -

ios - Invalid IPA: missing embedded provisioning profile. Are you sure this is an ad hoc? -