使用preg_replace替换反斜杠

时间:2016-06-22 03:16:02

标签: php regex preg-replace

我有以下文字,我试图摆脱\'。期望的输出为"Gigi DAgostino"

"Gigi D\'Agostino"

我已经检查过有关用preg_replace替换反斜杠的其他几个问题,并了解到我需要双重逃避它。所以我做了一些实验。

echo preg_replace("/\\\/",   "", "Gigi D\'Agostino");   // Gigi D'Agostino
echo preg_replace("/'/",     "", "Gigi D\'Agostino");   // Gigi D\Agostino
echo preg_replace("/\\\\'/", "", "Gigi D\'Agostino");   // Gigi DAgostino

到目前为止,这么好。这些都有道理。但在我的实际代码中,我使用单引号来表示模式。

echo preg_replace('/\\\/',    "", "Gigi D\'Agostino");  // Gigi D'Agostino
echo preg_replace('/\'/',     "", "Gigi D\'Agostino");  // Gigi D\Agostino
echo preg_replace('/\\\\\'/', "", "Gigi D\'Agostino");  // Gigi DAgostino

同样,前两个是有道理的。我没有得到第三个。为什么需要额外的斜线?

'/   (\\)->\       (\)->'    /'
      ^             ^
      |             |
   these two      this one
   escape the     escapes
   next \         the following '

额外的角色是什么(5 th \

我对正则表达式不太熟悉,所以我可能会遗漏一些非常简单的东西。

PS:我没有找到替换反斜杠的方法。上面的例子已经这样做了。我试图了解它的做法。

$str = "Gigi D\'Agostino";

# \ escapes '
echo preg_replace('/\'/', "", $str) . PHP_EOL;  # "Gigi D\Agostino"

# can't escape \ with a single \. it requires two \
echo preg_replace('/\\/', "", $str) . PHP_EOL;  # No ending delimiter '/' found

# \\ escapes the third \
echo preg_replace('/\\\/', "", $str) . PHP_EOL; # "Gigi D'Agostino"

# now we combine the patterns. we replace \'
# we need to escape both \ and '
# double backslashes to escape \, and a single backslash to escape '
# makes four backslashes and an apos: \\\ \'
# but ofc, this doesn't work. requires an additional \
echo preg_replace('/\\\\\'/', "", $str) . PHP_EOL;  # "Gigi DAgostino"

2 个答案:

答案 0 :(得分:0)

您可以使用str_replace()函数

echo str_replace("\'","","Gigi D\'Agostino")

答案 1 :(得分:0)

如果你开始使用单引号分隔模式,例如'/'/'(没有转义任何东西),你会注意到分隔符/超出单引号模式,这会导致错误。通过使用'转义\,分隔符将返回到单引号模式,并且单引号将被转义。如果您使用模式\'继续该过程,则应该明白发生了什么,并注意到该过程本身的模式。

     '/'/' - error: / delimiter outside of pattern
    '/\'/' - escape '
   '/\\'/' - escape \, unescape ', error: / delimiter outside of pattern
  '/\\\'/' - escape ', unescape \
 '/\\\\'/' - escape \, unescape ', error: / delimiter outside of pettern
'/\\\\\'/' - escape ', escape \

如果你继续并在模式中添加另一个\,猜猜会发生什么?是的,除了模式之外的分隔符...希望这会对正在发生的事情有所了解。