代码之家  ›  专栏  ›  技术社区  ›  Franz

php在中间插入省略号(!)一个字符串?

  •  0
  • Franz  · 技术社区  · 15 年前

    我正在开发一个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 包含多个法语单词(在本例中),并添加省略号 在逗号前面和右引号后面 .这必须意味着它是在内爆调用期间添加的,这完全没有意义。

    注意:注意字词的转义。

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

    我实际上是想给予支持,但我不能想出一个合理的解决办法…

    1 回复  |  直到 15 年前
        1
  •  0
  •   Franz    15 年前

    我们实际上设法解决了它(或者更确切地说,解决了问题)。问题是,创建这些帖子的其中一个成员当时似乎是用微软的Word或类似的程序写的。你们可能都知道,Word会自动将三个点转换成省略号。因此,这些柱子实际上包含了椭圆。

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

    多亏了你,沃尔克,你给我指明了正确的方向。