【问题标题】:PHP inserting ellipsis in the middle(!) of a string?PHP在字符串的中间(!)插入省略号?
【发布时间】:2010-12-09 06:12:07
【问题描述】:

我正在开发一个 PHP 论坛软件 (FluxBB),一个用户遇到了一个相当有趣的错误,那就是 - 看起来 - PHP 在字符串中间插入了一个省略号。

由于我在网上发现了一个类似的错误,我不得不说这段代码位于一个函数中,而$db 是一个全局变量。

这是(简化的)代码:

// Get unique words from the above arrays
$unique_words = array_unique(array_merge($words['add']['post'], $words['add']['subject']));

if (!empty($unique_words))
{
    $result = $db->query('SELECT id, word FROM '.$db->prefix.'search_words WHERE word IN('.implode(',', preg_replace('#^(.*)$#', '\'\1\'', $unique_words)).')', true) or error('Unable to fetch search index words', __FILE__, __LINE__, $db->error());

    $word_ids = array();
    while ($row = $db->fetch_row($result))
        $word_ids[$row[1]] = $row[0];

现在,$unique_words 包含多个法语单词(在这种情况下),省略号被添加在逗号之前和结束引号之后。这一定意味着它是在 implode 调用期间添加的,这根本没有意义。

注意:转义单词会得到处理。

事实上,只有 PHP 可能导致错误,因为调试器吐出的查询在执行之前已保存。

我其实是想提供支持,但我想不出一个合理的解决方案……

【问题讨论】:

  • 您能否提供$words['add']['post']$words['add']['subject'] 的示例数据,以便我们重现该行为? var_export($words['add']) 的输出会很好。
  • 我真的不能——尽管我可以要求他们。请参阅示例查询的下一个答案。您可以在此处获取原始主题中的更多信息:fluxbb.org/forums/post/26036/#p26036(正如我所说,我只是转发这个,因为这是我迄今为止遇到的最奇怪的错误之一)
  • 啊,我不应该把它作为答案发布,是吗?您可以在这篇文章中找到查询:fluxbb.org/forums/post/22891/#p22891 同样,只需搜索单词“vannes”即可找到带有省略号的点。

标签: php string ellipsis


【解决方案1】:

我们实际上设法修复了它(或者更确切地说,找出了问题所在)。问题在于,创建这些帖子的其中一位成员当时似乎用 Microsoft Word 或类似程序编写过。您可能都知道,Word 会自动将三个点转换为省略号。因此,帖子实际上包含省略号。

将该文本粘贴到论坛中会产生问题,因为 preg_replace 函数似乎对 utf-8 字符有一些问题(因为这似乎是一个问题)。再说一次,它们似乎不是唯一的,因为我的补丁也没有工作(修改后的版本也没有处理另一个 preg_replace)。

感谢你,Volker,你为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2019-07-24
    • 2010-10-11
    • 2021-10-24
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多