PHP - 转义美元符号

5

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

<?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

你的问题不太清楚。在单引号字符串('...')中,你根本不需要转义它。 - arkascha
请查看以下内容:http://php.net/manual/de/regexp.reference.escape.php - Adrian
@arkascha 我希望字符串中的美元符号只有奇数个反斜杠在其前面。如果是偶数,我会转义反斜杠。我同意你不需要用单引号转义,但这不是问题所在。 - user1032531
@arkascha 我当时没有意识到,但同意这是一个糟糕的例子。请查看我的更新帖子。 - user1032531
1
@arkascha。如果我告诉你我的真正问题,我会被扣分的!西雅图下雨了。我正在给女儿的房间涂漆,等待油漆干燥。无聊,所以想出了一个基本的模板引擎,只是为了好玩。它接受用户内容,解析它,并使用定义类的PHP文件,其中一个方法包含一些heardoc。不希望用户提供的内容有任何未转义的美元符号。只是为了好玩 :) - user1032531
显示剩余4条评论
2个回答

17

您正在使用单引号。在单引号中,美元符号不会被解析为任何内容。在PHP中,在单引号中不会自动解析任何内容。如果您使用双引号,则它们将自动解析:

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。


谢谢Robert,不幸的是,我没有很好地描述我想要实现的内容,这并没有回答我的问题。但是它是一个非常有信息性的回答,给你点赞(+1)。 - user1032531

10
这将实现你的要求。
$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是我记得的语言限制。 - user1032531
我已经更新了我的答案,包括一个正则表达式版本。你可以尝试一下,将字符串中的第一个 $ 包含进去。 - keyboardSmasher
@user1032531 如果你正在做一个简单的模板引擎,因为这些引擎通常需要进行大量的解析,请记住:正则表达式很慢,而str_replace则很快 :) 只要可能,尽量使用简单的字符串替换来满足你的需求。我个人非常喜欢正则表达式(我也不是巫师),但在需要处理大量字符串的代码中要谨慎使用它们! - undefined

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