您好,登錄后才能下訂單哦!
php正則匹配中文亂碼問題怎么解決?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
php正則匹配中文亂碼的解決辦法:首先打開PHP代碼文件;然后在代碼文件中加上UTF8修飾符即可,其正則表達式的語句如“preg_replace('/[萬]/u','萬',$a);”。
具體問題:
PHP字符串中用正則表達式匹配中文出現亂碼
<?php echo '<h3>正則表達式匹配中文</h3><br>'; $a = '天地不仁,以萬物為芻狗'; $b = preg_replace('/萬/','萬',$a); echo $b; echo '<h3>加上方括號后替換結果出現亂碼</h3><br>'; $c = '天地不仁,以萬物為芻狗'; $d = preg_replace('/[萬]/','萬',$a); echo $d; ?>
以上程序運行結果可以在http://nyaii.com/s/test.php看到。不知為何,為匹配的中文字符加上方括號后就出現了亂碼。同樣的情形,在javascript中執行就一切正常。
'天地不仁'.replace(/[天]/,'') //outputs "地不仁"
解決辦法:
加上UTF8修飾符即可
$d = preg_replace('/[萬]/u','萬',$a);
其余修飾符請見
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
以下為對于題主評論中的問題的補充內容
關于為什么[]內就需要加u修飾符的問題,實際上嚴格來說,兩種場合你最好都加上u修飾符
但為什么[]就會導致亂碼呢,這就要從字節層面而不是字符層面來解釋了。
首先我們知道PHP的字符串并不是Unicode進行存儲的,然后我們來看下這個代碼
<?php $a = "萬"; echo strlen($a); //3 for ($i = 0; $i < strlen($a); $i++) { echo dechex(ord($a[$i])) . ' '; //e4 b8 87 }
我們可以拿到"萬"字的utf8十六進制編碼是e4b887
所以在沒有開啟utf8修飾符的時候,正則表達式引擎并沒有把"萬"當成一個獨立的字符,而是三個字節的連續數據。
以下是結論:
當沒有[]進行匹配的時候,它尋找的是十六進制編碼值為 e4 b8 87 的三個連續字符,換句話說,實際上你的模式是\xe4\xb8\x87,但這種連續字符的出現在你的字符串中,只有"萬"字能對上,所以替換了并不會有亂碼。但如果你的字符串里面可能還要包括四字節的utf8編碼字符,例如emoji,可能就會導致問題了
當你在萬外面包裝了[],正則表達式引擎實際上找的是[\xe4\xb8\x87],懂正則表達式的很快就能發現它實際上是匹配這三個字符的任意一個,所以這個時候就會影響到除了萬以外的別的漢字了
當你加了utf8修飾符之后,"萬"會被正則表達式當成是一個獨立的字符,所以不再會產生這個問題
至于javascript,因為它對字符編碼是原生的unicode,每個字符都會被當成一個字符而不是拆分成字節數據,所以不會產生這個問題
感謝各位的閱讀!看完上述內容,你們對php正則匹配中文亂碼問題怎么解決大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。