PHP之無法去掉的字符串中間空格-不間斷空格

需求:去掉答案中的多餘空格,只保留一個半角空格。

$answer = preg_replace("/\s(?=\s)/","\\1",$answer);
$answer = trim($answer);

自測都是沒問題的。但是和端聯調的時候出現了一個奇怪的問題。看起來都是空格,但是卻怎麼也去不掉。
想來想去,打一下字符的ANSCII碼吧。於是出現了以下情況。發現160和32都是空格,但是ANSCII碼卻不同。
在PHP中trim可以去除字符串兩邊的空格和製表符等。但是trim卻去不掉這個字符。
在這裏插入圖片描述
原來:ASCII碼中有兩種特殊空格,雖然顯示一樣,但對應的的ASCII 碼值不一樣(一個碼值32,一個碼值160)

ASCII值是32:是用鍵盤輸入的空格,
ASCII值是160:不間斷空格(non-breaking space,縮寫nbsp),即   所產生的空格,作用是在頁面換行時不被打斷。

比如:
輸入hello world。但是world在此處必須要換行,但是又不希望提交上來是中間帶有換行的字符串,所以有了不間斷空格。
不間斷空格有個特點:無法被trim()所裁剪,也無法被正則表達式的\s所匹配。
所以,我用的兩種匹配都GG。

方法:
單獨去除不間斷空格,注意不能單獨去除,否則可能會去除無關字符

str_replace(chr(194).chr(160), '', $str);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章