当我使用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
所以我写了一些代码来清理它,但现在我错过了一些关键的空间。 dit它出错了怎么纠正?
$lines = file($_FILES['uploaded']['tmp_name']); //file in to an array
print_r
给出了
数组([0] => 文件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。数字0 [11] =>限制关[12] => 4号[13] =>意思 773,0 HV [14] =>标准。偏差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);
?>
答案 0 :(得分:1)
看起来你的文本文件在最开始的前两个字节中都有一个BOM(https://en.wikipedia.org/wiki/Byte_order_mark)。
使用xxd
实用程序诊断这种可能性(可在Unix / Linux上使用,甚至可以在Cygwin上使用。也可以在线获得)。
示例:
xxd -l2
将显示 fffe 。
同样的实用程序也可以帮助您确定其他&#39;垃圾&#39;您的文件中包含的字符。在这种情况下,只需使用xxd your_file_here
,然后查看您可能错过的内容。
通常它可能会引发这些问号,表明某些UTF-8编码字符未解析。
以编程方式,您可能希望以二进制模式打开文件,并在读取时向前移动fseek()
2个字节,或者使用专业级编辑器在处理之前修改和修剪这些字节。例如,使用Ultra-Edit,并切换到十六进制模式(Ctrl + H)。
答案 1 :(得分:0)
txt文件的编码和你的php脚本没有BOM的utf-8?数据库怎么样?和db连接?
如果您只打算执行一次或两次,那么继续使用substr()您要插入字符的字符串,否则您应该使用字符编码。 http://php.net/substr