天天看點

linux php空白字元,php去除字元串中的(特殊)空白字元

花了幾天來研究這個問題,然後發現這樣就可以,那就不用往下看了

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); //"|||||||||" 兩個方法去除效果一緻