如何删除NBSP?

时间:2015-10-06 20:17:47

标签: php mysql regex excel unicode

使用PHP在* .txt文件上执行file_get_contents。然后将数据插入MySQL。值插入null。 null是由非中断空间和excel导出中的替换字符引起的。我想通过将文本文件中的字符复制到unicode inspector 替换字符也一样。复制文本并粘贴here进行确认。

尝试了很多str_replacepreg_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_replacestr_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);

2 个答案:

答案 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