【问题标题】:How to remove NBSP? [closed]如何删除 NBSP? [关闭]
【发布时间】:2015-10-06 20:17:47
【问题描述】:

使用 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 的文件的 sn-p 数据。

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);

【问题讨论】:

  • $nbsp 定义为?加文件内容是?
  • @Fred-ii- 这是一个不间断的空间
  • @MattJamison 您链接的问题有一个使用~\x{00a0}~siu 的答案,而在您的版本中您没有添加修饰符。使用 unicode 时,使用 u 修饰符至关重要。
  • @HamZa 也没有用。
  • 您正在使用 $nbsp$name (两个变量);如果要在字符串中替换它,则必须使用相同的变量名进行下一次替换。希望有帮助。 @OP:是否在 file_get_contents 之后和将其插入 DB 之前检查打印结果?

标签: php mysql regex excel unicode


【解决方案1】:

为什么您的大多数尝试都失败了

$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 hack。

$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 版本。

【讨论】:

  • 这些对 nbsp 有好处。来自 excel 的替换字符呢?
  • 优秀且内容丰富的答案! +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

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2022-11-15
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多