【问题标题】:Explode is not working as it should when string fetched from database从数据库中提取字符串时,Explode 无法正常工作
【发布时间】:2020-12-03 23:19:37
【问题描述】:

我正在尝试对保存在我的数据库中的产品名称使用explode。我有一个产品名为:A4Tech KR-83FN Multimedia Bangla USB 黑色舒适圆边键帽普通键盘 在数据库中。当我使用选择查询获取条目并对其使用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 和空格 替换为“”,它不应该替换空格,但该部分实际上删除了每一位从以下数组的第四个元素开始的空间。因此,空间不被视为空间。

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)

【问题讨论】:

  • 请发布您的代码的其他部分(将除 a-zA-Z0-9 和空格替换为“”)
  • @KenLee 使用这个:$cleaned = preg_replace("([^a-zA-Z0-9])","",$str);
  • @syd 你没有在那个正则表达式中添加空格...
  • @Steven 抱歉。实际上有两条线。一个替换空间,一个不替换。我错误地发布了错误的行。这确实是一个标签,导致了问题。

标签: php arrays explode


【解决方案1】:

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

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

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

在您的情况下,但是字符串应该是60 bytes,实际上是68 bytes(根据您的问题)所以我敢打赌,而不是制表符(单个制表符只会将它带到64 bytes)你有换行符/carriage 像 \r\n 一样返回。

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

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

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

【讨论】:

  • 谢谢。需要添加一行以将所有制表符替换为trim(preg_replace('/\s+/', ' ', $ss));
猜你喜欢
  • 1970-01-01
  • 2018-11-13
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多