从数据库中获取字符串时,Explode 无法正常工作

Explode is not working as it should when string fetched from database

我正在尝试对数据库中保存的产品名称使用爆炸。我在数据库中有一个名为:A4Tech KR-83FN Multimedia Bangla USB Black Comfort Round Edge Keycaps Normal Keyboard 的产品。当我使用 select 查询获取条目并对其使用 explode 时,它​​无法正常工作,并得到以下数组:

array (size=4)
  0 => string 'A4Tech' (length=6)
  1 => string 'KR-83FN' (length=7)
  2 => string 'Multimedia' (length=10)
  3 => string 'Bangla USB Black Comfort Round Edged Keycaps Normal Keyboard' (length=68)

但是,当我复制文本并对其使用 explode() 时,它工作正常。

array (size=12)
  0 => string 'A4Tech' (length=6)
  1 => string 'KR-83FN' (length=7)
  2 => string 'Multimedia' (length=10)
  3 => string 'Bangla' (length=6)
  4 => string 'USB' (length=3)
  5 => string 'Black' (length=5)
  6 => string 'Comfort' (length=7)
  7 => string 'Round' (length=5)
  8 => string 'Edged' (length=5)
  9 => string 'Keycaps' (length=7)
  10 => string 'Normal' (length=6)
  11 => string 'Keyboard' (length=8)

代码如下:

<?php
$conn = new mysqli("localhost", "root", "", "dbname");;
$sql = "select * from products where name like '%A4Tech KR-83FN Multimedia%'";
$result = $conn->query($sql);
$row = $result->fetch_row();
$ss = $row[5];
//$ss = "A4Tech KR-83FN Multimedia Bangla USB Black Comfort Round Edged Keycaps Normal Keyboard";
$exploded = explode(" ",$ss);
var_dump($exploded);

我想我遗漏了一些简单的东西,它是唯一有这个问题的产品名称。

我在它后面还有另一部分代码,它将 a-zA-Z0-9 和 space 以外的所有内容替换为“”,它不应该替换space 但该部分实际上从以下数组的第四个元素中删除了 space 的每一位。因此,space 未被视为 space。

array (size=4)
  0 => string 'A4Tech' (length=6)
  1 => string 'KR-83FN' (length=7)
  2 => string 'Multimedia' (length=10)
  3 => string 'Bangla USB Black Comfort Round Edged Keycaps Normal Keyboard' (length=68)

如果代码对数据库中除此产品之外的所有产品都有效,那么按理说错误与此文本的格式有关。

通常我的赌注是字符串包含制表符而不是在它停止工作的点之后的 spaces:

A4Tech KR-83FN Multimedia Bangla USB Black Comfort Round Edged Keycaps Normal Keyboard
      ^       ^          ^      ^   ^     ^       ^     ^     ^       ^      ^
    {        Spaces         } {        Tabs                                     }

然而,在你的情况下,字符串应该是 60 bytes,实际上是 68 bytes(根据你的问题)所以我敢打赌,而不是制表符(单个制表符只会把它带到 64 bytes) 你有 newline/carriage returns 喜欢 \r\n.

鉴于它只是一种产品,我强烈建议您手动更改条目...

您的更新 - 替换 [^a-zA-Z0-9 ] 的附加代码 - 似乎证实了理论。

当然可以是\t\t\n\t\n\n或任何其他白色space字符的组合。