PHP - 转义美元符号

Posted

技术标签:

【中文标题】PHP - 转义美元符号【英文标题】:PHP - Escape dollar sign 【发布时间】:2015-07-26 18:50:03 【问题描述】:

如何修改字符串以确保美元符号前面有奇数个反斜杠?

<?php
  $string = file_get_contents('somefile.txt');
  echo($string."\n");
  $string=str_replace ('$' , '\$' ,$string);
  echo($string."\n");
 ?>

somefile.txt

$first
\$second
\\$third
\\\$forth
\\\\$fifth

输出

    $first
\$second
\\$third
\\\$forth
\\\\$fifth
\$first
\\$second
\\\$third
\\\\$forth
\\\\\$fifth

【问题讨论】:

不清楚你问的是什么。在单引号字符串 ('...') 中,您根本不必转义它。 看看这个:php.net/manual/de/regexp.reference.escape.php 你的问题没有多大意义。转义字符仅在源代码中有意义。一旦源代码被解析,它们就会被转义序列所代表的任何字符替换,而你不再拥有它们(你当然不能把它们放进去——太晚了)。您可能想要生成一些源代码(以某种语言或数据格式)并确保数据被正确转义,但不清楚您是否正在这样做或您尝试生成哪种语言。 @arkascha 我希望字符串中的美元符号前面只有奇数个反斜杠。如果是这样,我正在逃避反斜杠。我同意你不需要用单引号转义,但这不是问题。 @Quentin 也许我应该重写这个问题。我希望美元符号前面有奇数个反斜杠,这样如果它是源代码,它就会被转义。 【参考方案1】:

你在单引号中。在单引号中,美元符号不会被解析为任何东西。在 php.ini 中,没有任何东西在单引号中自动解析。如果你使用双引号,它们会被自动解析:

echo "$var"; // this will print the value of $var;
echo '$var'; // this will print $var;
echo "\$var";// this escapes the dollar sign so it will print $var;

如果字符串是用双引号创建的,那么你不能只是在之后转义美元符号,因为它已经被解析为变量。 示例:

$var = 'hello';
$str = "$var";

此时,当 $str 的值为 hello 而不是 $var 时,您将尝试添加转义符 \$。

【讨论】:

谢谢罗伯特,不幸的是,我没有很好地描述我想要完成的工作,它没有回答我的问题。但是,+1 以获得非常丰富的答案。【参考方案2】:

这将满足您的要求。

$string = '$first \$second \\$third  \\\$forth \\\\$fifth';
echo $string."\n";
$string = str_replace(['\\','$'], ['', '\$'], $string);
echo $string."\n";

在某种程度上,无论如何。它首先删除所有\,然后将所有$ 更改为\$

顺便说一句,echo 不是函数。 :)

我不是正则表达式向导,因此以下内容将在 \ 之前的所有零和偶数上添加一个反斜杠 $(字符串中的第一个除外):

$string = <<<'EOL'
$first $another \$second \\$third  \\\$forth \\\\$fifth
EOL;
var_dump($string);
$string = preg_replace('/([^\\\])(([\\\]2)+)?\$/', '$1$2\\\$', $string);
var_dump($string);

【讨论】:

感谢keyboardSmasher。是的,这就是我要问的。认为有一个好方法可以只在存在零个或偶数个现有反斜杠的情况下添加反斜杠吗?是的,echo 是我记得的语言限制。 我已更新我的答案以包含正则表达式版本。您可以使用它来将第一个 $ 包含在字符串中。

以上是关于PHP - 转义美元符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中回显包含未转义的美元符号的变量

PHP函数PHP 去掉字符串中的转义符号

Velocity——字面值和转义

js转义特别符号

HTML-实体(转义字符)

在 $_GET 中使用转义 & 符号的 htaccess 重写规则失败