php - 上传和清理 *.txt 文件删除太多空格
问题描述
当我使用 php 上传脚本上传文本文件 (*.txt) 并将其发送到数据库时,有很多不需要的字符,它们不会出现在屏幕上,但会在数据库中显示为 �(每个正常字符)。
这是我上传的文字:
File test_02
Date 15. Juni 2018
Start of Meas. 11:09
Tester
Probe/Test Force Sono50/50N
Probe-SN 777
Dwell Time 0 sec
Material table Steel A1
Norm; HV EN ISO 18265
Adjustment File Unnamed
Adj. Number 0
Limits Off
Number 4
Mean 773,0 HV
Std. Deviation 9,5 HV 1,2%
Maximum 785,0 HV
Minimum 763,8 HV
R 21,2 HV 2,7%
Cp
Cpk
1 763,8 HV
2 785,0 HV
3 775,8 HV
4 767,1 HV
所以我写了一些代码来清理它,但我现在缺少一些关键空间。哪里出错了,如何纠正?
$lines = file($_FILES['uploaded']['tmp_name']); //file in to an array
print_r
给
数组 ( [0] => ��File test_02 1 => 日期 15. Juni 2018 [2] => 开始测量 11:09 [3] => 测试仪 [4] => 探头/测试力 Sono50/50N [ 5] => Probe-SN 777 [6] => 停留时间 0 秒 [7] => 材料表钢 A1 [8] => 标准;HV EN ISO 18265 [9] => 调整文件未命名 [10] => Adj. Number 0 [11] => Limits Off [12] => Number 4 [13] => Mean 773,0 HV [14] => Std. Deviation 9,5 HV 1,2% [15] => 最大值785,0 HV [16] => 最小 763,8 HV [17] => R 21,2 HV 2,7% [18] => Cp [19] => Cpk [20] => [21] => 1 763,8 HV [22] => 2 785,0 HV [23] => 3 775,8 HV [24] => 4 767,1 HV [25] => ) 1
这是我将所有不需要的字符更改为下划线,然后用一个空格替换所有下划线的技巧。
<?php
// convert spaces to underscore
$lines_01 = str_replace(' ', '_', $lines[01]);
$lines_02 = str_replace(' ', '_', $lines[02]);
$lines_04 = str_replace(' ', '_', $lines[04]);
$lines_05 = str_replace(' ', '_', $lines[05]);
$lines_06 = str_replace(' ', '_', $lines[06]);
$lines_07 = str_replace(' ', '_', $lines[07]);
$lines_08 = str_replace(' ', '_', $lines[08]);
$lines_14 = str_replace(' ', '_', $lines[14]);
$lines_17 = str_replace(' ', '_', $lines[17]);
$lines_21 = str_replace(' ', '_', $lines[21]);
$lines_22 = str_replace(' ', '_', $lines[22]);
$lines_23 = str_replace(' ', '_', $lines[23]);
$lines_24 = str_replace(' ', '_', $lines[24]);
// remove unwanted text and keep normal charcaters
$lines_01 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_01);
$lines_02 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_02);
$lines_04 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_04);
$lines_05 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_05);
$lines_06 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_06);
$lines_07 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_07);
$lines_08 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_08);
$lines_14 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_14);
$lines_17 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_17);
$lines_21 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_21);
$lines_22 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_22);
$lines_23 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_23);
$lines_24 = preg_replace('/[^A-Za-z0-9\,.:_]/', '', $lines_24);
// convert one or multipe underscore to spaces
$lines_01 = preg_replace('/_+/', ' ', $lines_01);
$lines_02 = preg_replace('/_+/', ' ', $lines_02);
$lines_04 = preg_replace('/_+/', ' ', $lines_04);
$lines_05 = preg_replace('/_+/', ' ', $lines_05);
$lines_06 = preg_replace('/_+/', ' ', $lines_06);
$lines_07 = preg_replace('/_+/', ' ', $lines_07);
$lines_08 = preg_replace('/_+/', ' ', $lines_08);
$lines_14 = preg_replace('/_+/', ' ', $lines_14);
$lines_17 = preg_replace('/_+/', ' ', $lines_17);
$lines_21 = preg_replace('/_+/', ' ', $lines_21);
$lines_22 = preg_replace('/_+/', ' ', $lines_22);
$lines_23 = preg_replace('/_+/', ' ', $lines_23);
$lines_24 = preg_replace('/_+/', ' ', $lines_24);
// remove unwanted text
$lines_01 = str_replace('Date ', '', $lines_01);
$lines_02 = str_replace('Start of Meas. ', '', $lines_02);
$lines_04 = str_replace('ProbeTest Force ', '', $lines_04);
$lines_05 = str_replace('ProbeSN ', '', $lines_05);
$lines_06 = str_replace('Dwell Time ', '', $lines_06);
$lines_07 = str_replace('Material table ', '', $lines_07);
$lines_08 = str_replace('Norm HV', '', $lines_08);
$lines_14 = str_replace('Std. Deviation ', '', $lines_14);
$lines_17 = str_replace('R ', '', $lines_17);
$lines_21 = str_replace('1 ', '', $lines_21);
$lines_22 = str_replace('2 ', '', $lines_22);
$lines_23 = str_replace('3 ', '', $lines_23);
$lines_24 = str_replace('4 ', '', $lines_24);
?>
解决方案
看起来您的文本文件在前两个字节的开头有一个 BOM ( https://en.wikipedia.org/wiki/Byte_order_mark )。
使用实用程序诊断这种可能性xxd
(在 Unix/Linux 甚至 Cygwin 上可用。也许也可以在线获得)。
例子:
xxd -l2
如果您的文件标有字节顺序,将显示fffe 。
相同的实用程序还可以帮助您确定您的文件还有哪些其他“垃圾”字符。在这种情况下,只需使用xxd your_file_here
,看看你可能错过了什么。
通常它可能会引发这些问号,表明某些 UTF-8 编码字符未解析。
以编程方式,您可能希望以二进制模式打开文件,并fseek()
在读取文件时向前 2 个字节,或者在处理它之前修改和修剪这些字节,使用专业级编辑器。例如使用 Ultra-Edit,并切换到十六进制模式 (Ctrl+H)。
推荐阅读
- r - 将列表拆分为其组件并在 R 中组合形成另一个列表
- dataframe - Julia - 数据框 - 如何在 by() 中使用字符串进行自定义输出列命名
- c# - 如何在 C# 中快速处理 csproj 文件
- java - Spring Boot 不断让我的电脑崩溃……Windows 10 上 sts.ini 文件的最佳配置是什么?
- phpunit - 使用订阅时使用 postGraphQL 进行 Lighthouse 测试失败
- mysql - 如何在mysql中合并4列数据?(3 列始终为空)
- latex - 带有 LaTeX 和旋转页面的 Ghostscript
- python - 使用 Rest API 查询访问 confluence 页面
- java - 如何正确测试自定义对象中的 char[ ] 字段是否存在空值、空白或空值?以及为什么 char[ ] 表示长度为 11?
- laravel - Laravel 集体旧文本框中