PHP中的str_replace用于反斜杠

5
我需要在以下字符串中将 \ 替换为 ''。
$x = "FBU4061\0258";

当我执行 $x = str_replace('\\', '', $x);

它返回 FBU40618,

是否有任何解决方法可以获得 FBU40610258。

注意:我需要在双引号内执行此操作。在单引号内,它可以毫无问题地返回所需值。


@RensTillmann,它不能使用双引号,请查看我的注释。 - Shaolin
@RobbieAverill,是的。有什么解决方法吗? - Shaolin
@RensTillmann,对于普通字符串来说这是可行的,但我的情况有所不同。请参考此链接:https://dev59.com/t2Mm5IYBdhLWcg3wlvwK - Shaolin
请注意,stripslashes 可以处理双引号和单引号。 - Rens Tillmann
@RobbieAverill ,实际上 $x 是来自数据库的,我们需要使用 json_encode($x, JSON_UNESCAPED_SLASHES)。但是,我们得到的值为"FBU4061\u00158",所以我们想在编码之前删除或替换斜杠。 - Shaolin
显示剩余12条评论
3个回答

5
这里可能会让您感到困惑的是,双引号字符串与单引号字符串对此字符串的解释方式截然不同。在 PHP 中,双引号字符串 "FBU4061\0258" 会将字符串中的 \02 解释为 STX(或文本开始)字符(即 ASCII 字符 02)。尝试在 PHP 中执行代码 var_dump("FBU4061\0258"); 并查看输出,您会发现结果并非您所期望的。您甚至可以执行 var_dump(bin2hex("FBU4061\0258"));,以进一步澄清字符串的十六进制表示形式...

示例

var_dump(bin2hex('\02'));
// string(6) "5c3032"
var_dump(bin2hex("\02"));
// string(2) "02"

看到区别了吗?

这在手册中都有详细的说明

\[0-7]{1,3} 匹配该正则表达式的字符序列是一个八进制表示的字符

因此,为了获得字符串文字FBU4061\0258,您必须在双引号字符串中转义反斜杠。

$x = "FBU4061\\0258";
$x = str_replace('\\', '', $x);
var_dump($x); //string(11) "FBU40610258"

请注意,这是因为您在代码中放置了一个字符串字面量。但是,如果此字符串从数据库中检索出来,则不会发生此插值,因为它已经是一个字符串字面量。

再次提醒...

var_dump("FBU4061\\0258"); // string(12) "FBU4061\0258"
var_dump("FBU4061\0258");  // string(9) "FBU40618"

看看字符串长度的明显差异!

我理解这个问题,我们正在评估可能的解决方案。感谢您的帖子。 - Shaolin

2
您最好的选择是使用mysql替换查询:
更改查询中的值:
SELECT REPLACE('http://yourdomain.com','http','https');
更多信息请参见:https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace 您也可以尝试这个:
UPDATE table SET field_name = replace(field,'http','https')
更多信息请参见:https://dba.stackexchange.com/questions/2261/how-do-i-remove-backslashes-from-records-in-mysql

0

使用 php 的 stripslashes

echo stripslashes('FBU4061\0258');

或者尝试这段代码:

function removeslashes($string)
{
    $string=implode("",explode("\\",$string));
    return stripslashes(trim($string));
}

$text="FBU4061\0258";
echo removeslashes($text);

去除反斜杠,了解更多细节


如我之前所说,这可以使用单引号完成,但我需要使用双引号。如果您使用双引号,您会发现它不起作用。 - Shaolin
那不一定是个问题? - Rens Tillmann
@RensTillmann,请尝试并查看,实际上上述值来自数据库,因此它带有双引号。 - Shaolin
@Rahautos,问题中的示例使用双引号,因此这不是一个准确的答案。 - scrowler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接