花了幾天來研究這個問題,然後發現這樣就可以,那就不用往下看了
function trim_blank($str){
return preg_replace('/\s/u','',$str);
}
項目中遇到的問題
php項目中,導入Excel表格,擷取資料時,發現一列資料頭部存在空格,趕緊加上trim來去除空格,發現無法去除。
json_encode資料後發現資料頭部出現的空格編碼為’\u00a0′.
對于隻是簡單的取出此空格的方法,想出來三種:
preg_replace('/ /','',$str);
$str = ' 123123';
$str = json_encode($str); //轉碼為 '\u00a0123123'
preg_replace('/\\\u00a0/','',$str);
preg_replace('/\x{00a0}/u','',$str);
額外說下preg_replace中的三個反斜杠的問題:
官方文檔 http://php.net/manual/zh/regexp.reference.escape.php 中寫的“比較清楚”:譯注: “/\/”, 首先它作為字元串,反斜線會進行轉義, 那麼轉義後的結果是/\/,這個才是正規表達式引擎拿到的模式, 而正規表達式引擎也認為 \ 是轉義标記,它會将分隔符 / 進行轉義, 進而得到的是一個錯誤,是以,需要 4 個反斜線才可以比對一個反斜線。
當然,實際使用發現三個‘\’也是可以的
關于空白字元再多查找下資料
php的trim()方法,預設移除兩側的以下字元:
符号
說明
“\0”
NULL
“\t”
制表符
“\n”
換行
“\x0B”
垂直制表符
“\r”
回車
” “
空格
使用preg_replace()中的\s正則替換:
文檔說是 任意空白字元,但是經測試并不能移除上邊的 \u00a0,也是隻能移除一般的空白字元.
最後,經過詳細測試搜尋,http://php.net/manual/zh/regexp.reference.character-classes.php 中關于字元類的描述中發現一句話
空白字元有HT(9)、 LF(10)、VT(11)、 FF(12)、CR(13)、space(32)。 注意, 這個清單包含了垂直制表符。這使得space不同于\s, 因為它不包含垂直制表符(為了向 perl 相容)
這使得space不同于\s中space指代的應該是空白字元類,是以\s【應該】也隻是可以去除這些普通的空白字元。
那麼,有哪些空白字元呢?
沒有搜到具體的說有哪些空白字元的東西,但是js的正規表達式裡\s看可以比對的空白範圍還是比較廣泛的
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
Matches a single white space character, including space, tab, form feed, line feed. Equivalent to [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].
For example, /\s\w*/ matches ' bar' in "foo bar."
其中\u2028表示行分隔符,\u2029表示段落分隔符,\ufeff表示位元組順序标記
此處又是知識點啊
https://zhuanlan.zhihu.com/p/27222802
位元組順序标記:
即BOM(byte-order mark)。最初,字元U+FEFF如果出現在位元組流的開頭,則用來辨別該位元組流的位元組序——是高位在前還是低位在前;如果它出現在位元組流的中間,則表達為該字元的原義——(ZERO WIDTH NO-BREAK SPACE零寬度無斷空白)。從Unicode 3.2開始,U+FEFF隻能出現在位元組流的開頭,且隻能用于辨別位元組序,就如它的别名——位元組序标記——所表示的意思一樣;除此以外的用法已被舍棄。取而代之的是,使用U+2060來表示零寬度不中斷空格。
是以暫且已js的\s為準來去掉空白字元。
如果還是用正則替換的話:
function trim_blank($str){
//partern的第一位是個空格
$partern = '/[ \x{00a0}\x{1680}\x{2000}-\x{200a}\x{2028}\x{2029}\x{202f}\x{205f}\x{3000}\x{feff}\x{2060}]/u';
return preg_replace($partern, '', $str);
}
//但一個不小心的嘗試,發現這樣也可以。。。囧。。。
function trim_blank($str){
return preg_replace('/\s/u','',$str);
}
//測試
$str = '| | | | | | | | |';
echo json_encode($str); //"| |\u00a0|\u1680|\u2000|\u2001|\u200a|\u205f|\u3000|"
echo remove_white_space($str); //"|||||||||" 兩個方法去除效果一緻