1

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

例如:\\servername\sharename

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

因此,使用addslashes,它会忽略第一组双反斜杠,而使用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

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

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

4

4 回答 4

1

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

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

和这个

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

即使使用单引号,PHP 也会对双斜杠进行转义,因为它用于转义单引号。

于 2010-12-14T20:48:26.333 回答
1

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

$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

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

于 2010-12-14T21:06:38.563 回答
1

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

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

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

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

$variable = 'In the box labeled Folder type: \\\\servername\\sharename';
于 2010-12-14T23:43:57.967 回答
-1

通过更多的测试,我确定它确实与 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在退出时使用。

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

于 2010-12-15T16:30:44.580 回答