亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP一段正則表達式匹配結果不一致的問題

PHP一段正則表達式匹配結果不一致的問題

九州編程 2019-04-09 20:25:22
我自定的函數如下,功能是匹配出特殊字符:functionhasSpecialChar($subject){$pattern="/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/";if(preg_match($pattern,$subject)){returntrue;}returnfalse;}我的結果:var_dump(hasSpecialChar('問答社區'));//booleantruevar_dump(hasSpecialChar('Segmentfault'));//booleanfalsevar_dump(hasSpecialChar('@Segmentfault'));//booleantrue可以從第一個結果中看出是'問答社區'這個中文字符串被匹配出了特殊字符,但是我在Rubular上匹配'問答社區'則匹不出特殊字符,請問是不是我哪里寫錯了?還是preg_match函數的為題呢?一直找不到原因。路過的大哥們幫幫忙,謝謝。
查看完整描述

2 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

但是我在Rubular上匹配'問答社區'則匹不出特殊字符
Rubular是基于Ruby的,Ruby1.9以后對中文支持得很不錯了。
請問是不是我哪里寫錯了?
需要加上u修飾符,開啟UTF-8支持
$pattern="/[`~!@#$%^&*()+=|{}':;',\\[\\].<>\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/u";
一直找不到原因。
是PHP對中文支持不夠好。
中文在PHP里是以16進制保存的,這就帶來問題了。
比如,你的例子中,你匹配的那些特殊符號中包括中文的逗號,你告訴PHP的是,我要匹配一組特殊符號,其中包括中文的逗號,[,],但是PHP不認識中文,它聽到的是,你要匹配一組數據,其中包括\xef、\xbc、\x8c(中文逗號轉換成十六進制),然后你傳給它的“問答社區”,其中“區”字轉換成十六進制就是\xe5、\x8c、\xba。你可以看到,這里\x8c匹配上了,所以最后結果是true。
同理,你可以嘗試找一下答字是因為和哪個特殊符號的十六進制匹配上了?
                            
查看完整回答
反對 回復 2019-04-09
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

php漢字匹配可以考慮mb_相應的函數,例如:mb_ereg(),雖然有些問題,但是大體上能比較省事的解決問題。
如果使用GBK字符集建議考慮轉成UTF-8再處理。
                            
查看完整回答
反對 回復 2019-04-09
  • 2 回答
  • 0 關注
  • 376 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號