簡體   English   中英

搜索並替換特殊字符PHP

[英]Search And Replace Special Characters PHP

我正在嘗試搜索和替換要從csv文件解析的字符串中的特殊字符。 當我用vim打開文本文件時,顯示字符為<95>。 我一生都無法弄清楚將preg_replace用作什么字符。 任何幫助,將不勝感激。

謝謝,

克里斯·愛德華茲

0x95可能應該代表Windows代碼頁1252中編碼的字符U + 2022項目符號( )。 您可以使用以下方法在字節字符串中刪除它:

$line= str_replace("\x95", '', $line);

或者,如果您擁有可以可靠地讀取非ASCII字符的CSV解析器,則可以使用iconv將數據的字符集從cp1252utf8 (或所需的任何其他編碼)。 否則,您可能希望刪除所有非ASCII字符,例如:

$line= preg_replace("/[\x80-\xFF]/", '', $line);

如果您的CSV解析器是fgetcsv()那么您會遇到問題。 從理論上講,您應該能夠對字符串進行預處理,然后再將其傳遞給str_getcsv() (PHP 5.3)。 不幸的是,這也意味着您必須讀取文件並自己一行一行地分割它,考慮到所引用的CSV值可能包含換行符,這樣做並非易事。 到編寫代碼正確處理時,您已經編寫了CSV解析器。 因此,您實際要做的就是將文件讀入字符串,進行預處理更改,將其寫回到臨時文件中,並讓fgetcsv()讀取該文件

替代方法是分別對fgetcsv()返回的每個字符串進行后處理。 但這也是不可預測的,因為PHP會使用系統默認編碼對輸入進行解碼,而不是僅僅為您提供該死的字節,從而破壞了輸入。 Windows之外的默認編碼通常是UTF-8,它不會自行讀取0x95字節,因為這將是無效的字節序列。 雖然您可以嘗試使用setlocale()更改系統默認編碼來解決此問題, 但這是一種非常糟糕的做法,它不能與您運行的依賴系統區域設置的任何其他應用很好地配合使用。

總而言之,PHP的內置CSV解析功能非常糟糕。

遵循Bobince的建議,以下對我有用:

analyse_file() -> http://www.php.net/manual/zh/function.fgetcsv.php#101238

function file_get_contents_utf8($fn) {
    $content = file_get_contents($fn);
    return mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}


if( !($_FILES['file']['error'] == 4) ) {
    foreach($_FILES as $file) {
        $n = $file['name'];
        $s = $file['size'];
        $filename = $file['tmp_name'];
        ini_set('auto_detect_line_endings',TRUE); // in case Mac csv
        // dealing with fgetcsv() special chars
        // read the file into a string, do your pre-processing changes
        // write it back out to a temporary file, and have fgetcsv() read that.
        $file = file_get_contents_utf8($filename);
        $tempFile = tempnam(sys_get_temp_dir(), '');
        $handle = fopen($tempFile, "w+");
        fwrite($handle,$file);
        fseek($handle, 0);
        $filename = $tempFile;      
        // END -- dealing with fgetcsv() special chars
        $Array = analyse_file($filename, 10);
        $csvDelim = $Array['delimiter']['value'];
        while (($data = fgetcsv($handle, 1000, $csvDelim)) !== FALSE) {
            // process the csv file
        }
    } // end foreach
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM