使用PHP在* .txt文件上执行file_get_contents
。然后将数据插入MySQL。值插入null。 null是由非中断空间和excel导出中的替换字符引起的。我想通过将文本文件中的字符复制到unicode inspector
替换字符也一样。复制文本并粘贴here进行确认。
尝试了很多str_replace
和preg_replace
,但没有运气。几乎在这个SO问题上尝试了一切,发现这很有效。
$some_text_with_non_breaking_spaces = "Christ O'Connory";
$clean_text = hex2bin(str_replace('c2a0', '20', bin2hex($some_text_with_non_breaking_spaces)));
echo $clean_text;
但是,当我将其与file_get_contents()
方法内联时,它没有。
知道如何使用preg_replace
,str_replace
或其他方法解决空值?
以下是我尝试过的所有版本:
$name = str_replace('\A0\00', ' ', $nbsp);
$name = str_replace('c2a0', '20', $nbsp);
$name = str_replace('\xc2\xa0', ' ', $nbsp);
$name = str_replace('~\xc2\xa0~', ' ', $nbsp);
$name = str_replace('\xC2\xA0', ' ',$nbsp);
$name = str_replace(' ', ' ',$nbsp);
$name = hex2bin(str_replace('c2a0', '20', bin2hex($nbsp))); // this did work but not when putting inline with original code.
$name = preg_replace('#[A-Za-z\,\.\'\-\_]#', ' ', $nbsp);
$name = preg_replace('\x{00a0}', ' ', $nbsp);
$name = preg_replace('~\x00\xa0~', ' ', $nbsp);
$name = preg_replace('~\xc2\xa0~', ' ', $nbsp);
$name = preg_replace('\s\s+', ' ', $nbsp);
$name = preg_replace('/\s+/', ' ', $nbsp);
$name = preg_replace('~\x{c2a0}~siu', ' ', $nbsp);
$name = preg_replace('/\s/u', ' ', $nbsp);
$name = preg_replace('/[^\w\d\p{L}]/u', ' ',$nbsp);
以下是我尝试执行file_get_contents的文件的一小段数据。
SupervisorGivenName SupervisorSurName row_date logid item_name acdcalls AHT AvgHoldTime transferred CntOBCalls calls
Ders Schmid 09/02/2015 5054589 Christ O'Connory 26 420 112 4 0 0
Nic Flemg 09/02/2015 5054596 Mica Wit 28 543 32 6 0 0
Insert statement:
$bb_query = "INSERT INTO `tier1_bb_agent_daily` (`date`,`loginID`,`empID`,`firstname`,`lastname`,`supID`, `supName`,`acd_calls`,`paetec_acd_calls`,`aht`,`avg_hold_time`,`transferred`,`outbound_call_count`)
VALUES ('{$row['date']}','{$row['loginID']}','{$empID}','{$firstname}','{$lastname}','{$supid}','{$newSupName}',{$row['acd_calls']},{$row['paetec_acd_calls']},{$row['aht']},{$row['avg_hold_time']},{$row['transferred']},{$row['outbound_call_count']})
ON DUPLICATE KEY UPDATE firstname = '{$firstname}', lastname = '{$lastname}',empID = '{$empID}', supID = '{$supid}', supName = '{$newSupName}',acd_calls = {$row['acd_calls']}, aht = {$row['aht']}, paetec_acd_calls = {$row['paetec_acd_calls']}, avg_hold_time = {$row['avg_hold_time']}, transferred = {$row['transferred']}, outbound_call_count = {$row['outbound_call_count']}";
$db->query($bb_query);
答案 0 :(得分:3)
$name = str_replace('\A0\00', ' ', $nbsp);
$name = str_replace('c2a0', '20', $nbsp);
错误的逃脱序列。
$name = str_replace('~\xc2\xa0~', ' ', $nbsp);
正则表达式需要分隔符,而不是简单的字符串替换。
$name = str_replace('\xc2\xa0', ' ', $nbsp);
$name = str_replace('\xC2\xA0', ' ',$nbsp);
更正转义序列,但you need double-quoted strings for escape sequences to work。
$name = str_replace(' ', ' ',$nbsp);
仅适用于HTML实体。
$name = preg_replace('#[A-Za-z\,\.\'\-\_]#', ' ', $nbsp);
为什么要用空格替换A-Z?
$name = preg_replace('\x{00a0}', ' ', $nbsp);
缺少分隔符和Unicode修饰符。
$name = preg_replace('~\x00\xa0~', ' ', $nbsp);
尝试匹配NUL字符,缺少Unicode修饰符。
$name = preg_replace('~\xc2\xa0~', ' ', $nbsp);
这个应该适用于UTF-8。它等同于bin2hex
黑客。
$name = preg_replace('\s\s+', ' ', $nbsp);
缺少正则表达式分隔符。
$name = preg_replace('/\s+/', ' ', $nbsp);
缺少Unicode修饰符。
$name = preg_replace('~\x{c2a0}~siu', ' ', $nbsp);
错误的逃脱序列。
$name = preg_replace('/\s/u', ' ', $nbsp);
这个应该可以工作,但用空格替换每个空白字符。
$name = preg_replace('/[^\w\d\p{L}]/u', ' ',$nbsp);
应该可以工作,但也可以用空格替换标点符号。
如果您的输入被编码为UTF-8(如果bin2hex
黑客工作的话可能就是这样):
$result = str_replace("\xC2\xA0", ' ', $src); # or
$result = preg_replace('/\xC2\xA0/', ' ', $src); # or
$result = preg_replace('/\xA0/u', ' ', $src);
如果您的输入编码为ISO-8859-1:
$result = str_replace("\xA0", ' ', $src); # or
$result = preg_replace('/\xA0/', ' ', $src);
出于性能原因,首选str_replace
版本。
答案 1 :(得分:-2)
只需调试代码即可 在file_get_contents
之后打印文件内容$file_contents** = file_get_contents(......);
echo 'File Contents '."\n\n";
print_r($file_contents);
$modified = str_replace('\A0\00', ' ', $file_contents);
$modified = str_replace('c2a0', '20', $modified);
$modified = str_replace('\xc2\xa0', ' ', **$modified);
..................
echo 'Before DB'."\n\n";
print_r($modified);
//your insert here