php 去除變態空格字符方法,空格trim不掉問題解決思路


前言:今天過濾一段文本,后面有2個空格,用trim去不掉,用preg_match也去不掉,去網上翻閱了無數的方法,終於找到了非常好的一個解決方法。該文章來源於https://my.oschina.net/fffddgx/blog/196376   ,思路是  ,首先將字符分隔開,str_split, 然后循環每個字節查看他的編碼,ord();

trim函數

以php的trim 函數為例: 去除字符串首尾處的空白字符(或者其他字符)

string trim    ( string $str   [, string $charlist  ] ) 第二個參數可以指定要trim掉的字符

如果不指定第二個參數,trim() 將去除這些字符:

" " (ASCII32(0x20)),普通空格符。   
"\t" (ASCII9(0x09)),制表符。    
"\n" (ASCII10(0x0A)),換行符。    
"\r" (ASCII13(0x0D)),回車符。    
"\0" (ASCII00x00)),空字節符。    
"\x0B" (ASCII11(0x0B)),垂直制表符。

但是空白字符並不只是這些字符。比如全角空格(ascii:227)和一些控制字符,亂碼字符等等。全角空格這種情況是比較多的情況,如果確定空白字符是全角空格引起的可以直接

$value = str_replace("全角空格"," ",$value);

這樣可以解決大部分問題。如果還是解決不了,恭喜你,你越到了變態數據。

思路

對於變態數據可以考慮用下面的方法處理

1、分割字符串,將字符串分割成以一個字節為單位的字符組: str_split($str)

2、查看空白字符編碼。(比如遇到一個變態字符串前面的空格字符是:194 160 194 160,基本可以確定是這個字符的問題)

3、替換掉空白編碼 。比如用正則函數:

$value = preg_replace("/^[\s\v".chr(194).chr(160)."]+/","", $value); //替換開頭空字符
$value = preg_replace("/[\s\v".chr(194).chr(160)."]+$/","", $value); //替換結尾空字符

例子

如下程序:

//比如字符串: “ abc”(前面是兩個全角空格)
$str = "  abc";
$sArray = str_split($str);
foreach ($sArray as $s){
    var_dump(ord($s));
}

結果:

int(227)
int(128)
int(128)
int(227)
int(128)
int(128)
int(97)
int(98)
int(99)

發現a(97)前有2輪

int(227)
int(128)
int(128)

斷定這就是一個utf-8的空白字符,下面的程序去掉這個字符就可以

$str = preg_replace("/^[\s\v".chr(227).chr(128)."]+/","", $str); //替換開頭空字符
$str = preg_replace("/[\s\v".chr(227).chr(128)."]+$/","", $str); //替換結尾空字符

var_dump($str);

結果:string(3) "abc",成功去掉該變態空白字符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM