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