【问题标题】:PHP 'addslashes' not behaving as expectedPHP 'addslashes' 未按预期运行
【发布时间】:2010-12-14 20:31:56
【问题描述】:

这一直在发疯,但我似乎找不到答案。我们运行一个技术知识库,其中有时会包含用于映射到网络驱动器的 Windows samba 路径。

例如:\\servername\sharename

当我们包含有两个反斜杠的路径时,它们在运行“addslashes”时无法正确转义。我的预期结果是“\\\\servername\\sharename”,但它返回“\\servername\\sharename”。显然,稍后运行“stripslashes”时,双反斜杠前缀只是一个斜杠。我也尝试过使用str_replace("\\", "\", $variable);,但是当我期望"\\servername\sharename"时它返回"\servername\sharename"

因此,对于添加斜杠,它会忽略第一组双反斜杠,而对于 str_replace,它会将双反斜杠更改为单个编码的反斜杠。

我们需要运行addslashes 和stripslashes 来插入数据库;在我们的特定情况下,使用 pg_escape_string 将不起作用。

这是在 Apache 上的 PHP 5.3.1 上运行的。

编辑:示例代码
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
这将返回:In the box labeled Folder type: \\servername\\sharename

编辑:示例代码 #2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
这将返回:In the box labeled Folder type: \servername\sharename

我还想声明,使用单引号或双引号不会给我带来不同的结果(如您所料)。使用其中一个或两个都可以得到相同的确切结果。

有人对我能做什么有什么建议吗?

【问题讨论】:

  • 我只是在一个包含两个反斜杠的字符串上运行 addlashes 并得到四个反斜杠作为回报。我想需要一些代码示例。
  • 为什么 pg_escape_string 在你的情况下不起作用?
  • 第二个代码示例。不过,我想这将成为字符串处理 '' (无转义)和 "" (转义)之间的区别。

标签: php addslashes


【解决方案1】:

我想我知道哪里出了问题。试着运行这个:

echo addslashes('\\servername\sharename');

还有这个

echo addslashes('\\\\servername\sharename');

PHP 会转义双斜杠,即使是单引号,因为它是用来转义单引号的。

【讨论】:

  • 我的结果分别是\\servername\\sharename\\\\servername\\sharename
【解决方案2】:

对您描述的问题进行了测试,我可以获得您想要的行为的唯一方法是将条件与正则表达式结合起来,并在开始时预测双斜杠。

$str = '\\servername\sharename';
    if(substr($str,0,1) == '\\'){
    //String starts with double backslashes, let's append an escape one.
    //Exclaimation used for demonstration purposes.
    $str = '\\'.$str;
    echo addslashes(preg_replace('#\\\\\\\\#', '!',$str ));

    }

这个输出:

!servername\\sharename

虽然这可能不是一个直接的答案,但它确实有效,并说明了这两种结构如何处理转义字符的差异。如果使用,!可以使用另一个正则表达式轻松替换为所需的字符。

【讨论】:

  • 您的代码示例也对我有用。但是,共享路径永远不会出现在文章的正文中,它们可能会出现一次,或者根据作者的判断可能会出现多次。我必须编写一个 preg_replace 来匹配所有内容并替换它们,这不太理想。但是,如果这是我唯一可以上班的事情,那么我想我可能不得不这样做。感谢您的代码示例。
【解决方案3】:

这不是addslashes 的问题,而是您将字符串分配给变量的方式的问题。

$variable = 'In the box labeled Folder type: \\servername\sharename';
echo $variable;

这将返回:在标有文件夹类型的框中:\servername\sharename

这是因为双反斜杠被解释为转义反斜杠。请改用此作业。

$variable = 'In the box labeled Folder type: \\\\servername\\sharename';

【讨论】:

  • 我无法控制“变量”是什么。这只是我为这个问题创建的一个例子。 “变量”将是用户填写的表单中发布的任何内容。
  • @mririgo 无论如何,从您在问题中给出的示例 2 中,很明显该字符串不包含连续 2 个反斜杠,只有一个:\servername\sharename。问题不在于添加斜杠,而在于您的字符串。
【解决方案4】:

经过更多测试,我确定它确实与 PHP 处理硬编码字符串的方式有关。由于硬编码字符串不是我感兴趣的(我只是将它们用于测试/此示例),因此我创建了一个带有单个文本框和一个提交按钮的表单。 addslashes 会以这种方式正确地转义 POST 后的数据。

进行更多研究后,我确定我遇到的问题是 PostgreSQL 如何接受转义数据。在将数据插入 PostgreSQL 数据库时,它将删除在实际将数据放入表中时给出的任何转义字符。因此,stripslashes 在拉取数据时不需要去除转义字符。

此问题源于代码从 PHP 4.1(启用 Magic Quotes)迁移到 PHP 5.3(不推荐使用 Magic Quotes)。在现有系统 (PHP4) 中,我认为我们不知道 Magic Quotes 已启用。因此,所有 POST 数据都已被转义,然后我们在插入之前再次使用 addslashes 转义该数据。当它被插入 PostgreSQL 时,它会去除一组斜线并留下另一组,因此需要我们在退出时使用stripslashes。现在,关闭 Magic Quotes 后,我们可以使用 addslashes 转义,但在退出时不需要使用 stripslashes

很难组织和确定问题的确切位置,所以我知道这个答案与我最初的问题有点偏离。但是,我要感谢所有做出贡献的人。让其他人发表他们的想法总是有助于让您思考您自己可能没有的途径。

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2011-10-31
    • 2017-10-23
    • 2014-11-12
    • 1970-01-01
    • 2020-06-28
    • 2012-02-18
    • 2018-01-18
    相关资源
    最近更新 更多