摘要:今天我們來聊一下可能很多人都會頭疼的東西顯示長度。需求是這樣的,在字符的顯示上,兩個英文單詞才占一個中文或者其他語言的顯示長度。好在在無意間發現一個奇怪的東西這個函數計算非英文單詞外是除了符號例如中文就是按照漢字個數算的,也是同理。
今天我們來聊一下可能很多人都會頭疼的東西:顯示長度。
需求是這樣的,在字符的顯示上,兩個英文單詞才占一個中文或者其他語言的顯示長度。如下:
上面排的是兩個英文字母,一個漢字,一個Emoji。你會發現,在顯示上占的寬度是一致的。一些設計上為了好看也要求有這樣的處理。
例如,我們的用戶名需求是最多12個非單字節字符或者24個單字節字符的需求也可以混合排的需求,我們寫后端不得不處理這樣的驗證了。
需求規則是 /^a-zA-Z_x7f-xff*$/
在ThinkSNS+中,為了能把這部分驗證公用,所以選擇使用自定義驗證規則。我們先說下計算的實現思路吧!
首先,就算是mb_strlen也沒法準確的獲取多字節字符和單子節字符混合在一起的長度,網上有個說法,漢字占三個字節,英文數組半角符號占一個字節,所以:
用這個方法可以得到單字節占0.5多字節占1的計算。但是以中文為例,只有兩萬個漢字才是這種情況,還有六萬多漢字是四個,其次,emoji也是四個字節。根本無法準確的計算。
好在在無意間發現一個奇怪的東西str_word_count 這個函數計算非英文單詞外是除了符號例如中文就是按照漢字個數算的,emoji也是同理。
發現這個以后,咱們就好辦了。我們吧用戶名中的 [a-aA-Z0-9_] 剔除掉,多帶帶計算不就是我們要的驗證長度了嗎?
所以,首先我們用:
方式多帶帶計算出單字節字符的顯示長度,再用:
方式計算出多字節的長度,最后:
就得出了顯示長度,實現了,最后封裝成驗證規則:
代碼是原型代碼,還沒有進行優化,之后我們只要按照下面的方式用:
現在就很好的解決了這個需求。
我們很樂意,將基于 Laravel 的 ThinkSNS+ 產品開發中的技術解決方案分享給大家,也希望喜歡的朋友能給國內開源產品一點點的支持。
開源代碼倉庫GitHub:https://github.com/zhiyicx/thinksns-plus(點擊star,每日關注開發動態。)
官網:http://www.thinksns.com/
內測申請方式提供個人/企業聯系方式及認證信息(真實姓名 /企業營業執照照片或掃描件)及申請說明,發送郵件至lihecong@zhishisoft.com將有機會獲得首批內測資格,名額有限,申請從速。
開源不易,為了爭取開源,我們團隊做了很多努力。把基于Laravel的作品展示在大家面前,之后專欄會持續不斷的分享ThinkSNS +開發過程中的技術細節
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23074.html
摘要:本文主要全面講解在不適用第三方包的情況下,如何在基于框架上,研發社交系統時,簡歷一套優雅而不失性價比的用戶權限管理體系功能,內含真實代碼。需求場景就是用戶組權限節點,這個需求有很多很好的第三方包實現。但是已經足以勝任用戶組權限判斷邏輯了。 本文主要全面講解在不適用第三方包的情況下,如何在基于Laravel框架上,研發社交系統ThinkSNS+時,簡歷一套優雅而不失性價比的用戶權限管理體...
摘要:在社交系統中有這樣一個命令主要是用作包的安裝,升級,卸載。這在開發過程中很有用。內測申請方式提供個人企業聯系方式及認證信息實名企業營業執照照片或掃描件及申請說明,發送郵件至將有機會獲得首批內測資格,名額有限,申請從速。 在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個,這里重點講以下如何實現 plus-component 的。 plus-c...
摘要:需求場景發送驗證碼或者消息通知,可發送到手機或郵箱中。完成首先,在中的規范就是使用的消息通知,這里基于場景為驗證碼。所以我們在驗證碼模型中添加是完全符合通知的正確使用的。 順便發個小通知:7月15日ThinkSNS+開源版發布,同時非開源的APP也走出內測階段,體驗二維碼也全面發布體驗。 什么是ThinkSNS ? ThinkSNS(簡稱TS),一款全平臺綜合性社交系統,為國內外大中小...
閱讀 2922·2021-11-24 09:39
閱讀 3599·2021-11-22 13:54
閱讀 3409·2021-11-16 11:45
閱讀 2433·2021-09-09 09:33
閱讀 3194·2019-08-30 15:55
閱讀 1290·2019-08-29 15:40
閱讀 920·2019-08-29 15:19
閱讀 3396·2019-08-29 15:14