【问题标题】:PHP str_replace for back slashPHP str_replace 用于反斜杠
【发布时间】:2015-11-09 05:00:50
【问题描述】:

我需要将后面的字符串中的 \ 替换为 ''。

$x = "FBU4061\0258";

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

返回 FBU40618,

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

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

【问题讨论】:

  • @RensTillmann,它不适用于双引号,请参阅我的说明
  • 然后创建一个变量,然后做任何你想做的事?我不明白为什么会有所作为。
  • 我认为它在双引号中的点是它变得太晚了。一旦你使用了这个变量,\025 就会被转换成一个字符:eval.in/465229
  • @RensTillmann,当您使用双引号字符串时,PHP 会进行转义序列替换,\0 是 NUL 字节。

标签: php


【解决方案1】:

这里可能让您感到困惑的是双引号字符串与单引号字符串的解释非常不同。 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"

看到区别了吗?

This is all thoroughly documented behavior in the manual.

\[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"

看一下字符串长度的明显区别!

【讨论】:

  • 我了解问题所在,我们正在评估可能的解决方案。感谢您的帖子
【解决方案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

【讨论】:

    【解决方案3】:

    使用phpstripslashes

    echo stripslashes('FBU4061\0258');
    

    或者试试这个代码:-

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

    Stripslashes more details

    【讨论】:

    • 正如我上面所说的,它可以用单引号来完成,我需要使用双引号。如果你使用双引号,你会看到它确实是 bot 工作
    • 这不是问题吗?
    • @RensTillmann,请尝试看看,实际上上面的值来自数据库,所以它带有双引号
    • @Rahautos 问题中的示例使用双引号,所以这不是一个准确的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2015-02-02
    • 2019-03-31
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多