2016-11-01 14 views
7

मैं उस नाम को सत्यापित करना चाहता हूं जब कोई नया उपयोगकर्ता मेरे पृष्ठ पर साइन अप करता है। उन चेकों में से एक यह है कि चरित्र सीमा 100 से ऊपर नहीं है।इमोजी की वर्ण लंबाई की गणना करें?

लेकिन चूंकि एक एकल इमोजी ❤️ (वास्तव में वे 4 इमोजी एक साथ हैं? स्क्रीनशॉट देखें) 1 से अधिक चरित्रों की गिनती है मेरे पास मान्य करने के लिए समस्याएं हैं नाम। मैं नाम में इमोजी को अनुमति देने के लिए चाहता हूं, क्योंकि इन दिनों दिल, स्टार या कुछ समान होता है, लेकिन मैं 100 से अधिक वर्णों वाले नामों को अनुमति नहीं देना चाहता हूं।

  • कैसे वहाँ बाहर सभी इमोजी का एक चरित्र के रूप में एक इमोजी गिनती करने के लिए (अगर यह भी संभव है):

    तो मैं इस सवाल है?

पीएस: मैं एक PHP समाधान के बारे में बात कर रहा हूं, लेकिन मैं वैकल्पिक रूप से जावास्क्रिप्ट को भी स्वीकार करूंगा, भले ही मैं इसे पसंद नहीं करता।

संपादित करें:

The screenshot of this question, please notice the emoji output: \ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69

इस सवाल का उल्लेख स्क्रीनशॉट नोटिस करें: मेरे उदाहरण इमोजी इस स्ट्रिंग हो रहा है।

+0

दैट ' एक स्ट्रिंग के बजाय 'trim' पर एक सरणी पारित कर रहे हैं। यह आपके कोड में एक बग है, PHP के साथ कोई समस्या नहीं है, और इमोजी के साथ कुछ भी नहीं करना है। – deceze

+0

ओह, आप सही हैं। मैंने पाया कि त्रुटि और मेरे प्रश्न को संपादित किया। धन्यवाद। @deceze – AlexioVay

+0

इसके लायक होने के लिए, इस इमोजी में 8 यूनिकोड स्केलर मानों का अनुक्रम होता है: यू + 1 एफ 469 महिला; यू + 200 डी शून्य चौड़ाई जॉइनर; यू + 2764 हेवी ब्लैक हार्ट; यू + एफईएफएफ वैरिएंशन चयनकर्ता -16; यू + 200 डी शून्य चौड़ाई जॉइनर; यू + 1 एफ 48 बी किस मार्क; यू + 200 डी शून्य चौड़ाई जॉइनर; यू + 1 एफ 469 महिला। कुछ प्रोग्रामिंग भाषाएं वूमन और किस मार्क का इलाज करती हैं जैसे कि वे प्रत्येक के दो अक्षर थे, क्योंकि उन पात्रों को दो यूटीएफ -16 कोड इकाइयों का प्रतिनिधित्व करने की आवश्यकता होती है। –

उत्तर

6

यूनिकोड अमूर्त वर्णों को कोड बिंदु के रूप में परिभाषित करता है, लेकिन स्क्रीन पर इसे प्रस्तुत करने की क्या अनुमति है फ़ॉन्ट है। एक फ़ॉन्ट ग्राफिकल आकृतियों का संग्रह है, जिसे ग्लिफ कहा जाता है, और वे कोड बिंदु या कोड बिंदुओं का अनुक्रम का दृश्य प्रतिनिधित्व करते हैं। एकल ग्राफिकल इकाई के रूप में प्रदर्शित किए जाने वाले एक या अधिक कोड बिंदुओं का अनुक्रम ग्रैफेम कहा जाता है।

आप ग्रफीम इकाइयों में लंबाई प्राप्त करने के लिए की जरूरत है (और नहीं वर्ण, mb_strlen की तरह करना होगा), तो आपको grapheme_strlen उपयोग कर सकते हैं:

$emoji = "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}"; 
echo $emoji , " : " , strlen($emoji) , "\n"; // 27, count bytes 
echo $emoji , " : " , mb_strlen($emoji) , "\n"; // 8, count characters 
echo $emoji , " : " , grapheme_strlen($emoji) , "\n"; // 1, count grapheme units 

https://3v4l.org/KSSl4

+0

धन्यवाद! मैं सिर्फ आपको जवाब के रूप में पोस्ट करने के लिए कहना चाहता था। केवल यह मुद्दा हो सकता है कि मेरे सर्वर प्रदाता ने 'xlp' इंस्टॉल नहीं किया था जैसे कि मेरे xampp संस्करण को भी डिफ़ॉल्ट रूप से नहीं किया गया था। क्या इस मामले में "पुराने" कार्यों के साथ एक समाधान होगा? – AlexioVay

+1

सिम्फनी की पॉलीफिल आज़माएं, https://github.com/symfony/polyfill-intl-grapheme/blob/master/Grapheme.php – Federkun

4

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

उदाहरण के लिए

,

_.toArray('12').length; // --> 3 

या, यदि आप एक स्ट्रिंग से कुछ स्वैच्छिक वर्णों दस्तक करना चाहते हैं, तो आप में हेरफेर और सरणी में पुन: शामिल है, जैसे: पीएचपी चेतावनी आप का मतलब है

_.toArray("trimToEightGlyphs").splice(0,8).join(''); // --> 'trimToE' 
संबंधित मुद्दे