字符串中的$ <char>被解释为变量......如何规避?</char>

时间:2011-10-27 18:18:18

标签: php arrays

考虑以下文件(slang.txt):

$#!+  -   excrement
$$  -   money
$46  -   money for snusnu
$h!t  -   excrement
$xy  -   sexy
/.  -   Slashdot
*4u  -   Kiss for you
*67  -   unknown
*eg*  -   evil grin
07734  -   hello

我想将这些术语放入数据库中。为此,我首先必须将文本拆分为已清理的键值对。为此,我将slang.txt的内容复制到php文件:

$string = "$#!+  -   excrement
$$  -   money
$46  -   money for snusnu
$h!t  -   excrement
$xy  -   sexy
/.  -   Slashdot
*4u  -   Kiss for you
*67  -   unknown
*eg*  -   evil grin
07734  -   hello";

$list = explode("\n", $string);

foreach ($list as $item) {
  $pair = explode('-', $item);
  $result[trim($pair[0])] = trim($pair[1]);
}

print_r($result);

结果几乎就在那里:

Array
(
    [$#!+] => excrement
    [$$] => money
    [$46] => money for snusnu
    [!t] => excrement
    [] => sexy
    [/.] => Slashdot
    [*4u] => Kiss for you
    [*67] => unknown
    [*eg*] => evil grin
    [07734] => hello
)

问题:“$”术语(例如$ h!t和$ xy中的$ h)被解释为变量,因此不会复制到数组中,请参阅:[!t] =&gt;狗屎和[] =&gt;性感而不是[$ h!t] =&gt;狗屎和[$ xy] =&gt;性感。我该如何解决这个问题?

P.S。实际文件要大得多,所以我真的无法浏览内容并转义所有$或者其他内容,也不能将字符串放在单个括号之间(因为当有(并且有)时会破坏字符串正在使用的包含一个灾难的词语:)

4 个答案:

答案 0 :(得分:5)

使用单引号作为字符串:

$string = '$#!+  -   shit
$$  -   money
$46  -   money for sex
$h!t  -   shit
$xy  -   sexy
/.  -   Slashdot
*4u  -   Kiss for you
*67  -   unknown
*eg*  -   evil grin
07734  -   hello';

您必须在字符串中转义单引号,但这些可能不太常见。如果没有,你将不得不逃脱这一切。

或者更好的解决方案:将此文本存储在单独的文件中,并使用filefile_get_contents以字符串形式读入。

答案 1 :(得分:3)

使用NOWDOC会更好,而不仅仅使用单引号。在这种情况下,即使您的字符串包含',您也不必进行任何转义 - 并且第一行和最后一行更易于阅读。

$string = <<<'END'
$#!+  -   shit
$$  -   money
$46  -   money for sex
$h!t  -   shit
$xy  -   sexy
/.  -   Slashdot
*4u  -   Kiss for you
*67  -   unknown
*eg*  -   evil grin
07734  -   hello
END;

答案 2 :(得分:2)

直截了当的答案是使用单引号字符串文字(或更方便NOWDOC syntax)。

但是这忽略了这样一个事实:你正在以一种非常迂回的方式来实现这个目标。为什么在

时可以将文件内容移动到PHP变量中
$list = file('slang.txt');
$result = array();

foreach ($list as $item) {
  $pair = explode('-', $item);
  $result[trim($pair[0])] = trim($pair[1]);
}

print_r($result);

如果您认为每次加载外部文件都不合适,那就没问题。 为什么不将数组$result本身写为文字并节省更多时间?

echo var_export($result); // and copy/paste this into your PHP source

答案 3 :(得分:0)

使用单引号'而不是双引号"简单地定义字符串会阻止$被解释为变量:

$string = '$#!+  -   shit
$$  -   money
$46   -   money for sex
$h!t  -   shit
$xy  -   sexy
/.  -   Slashdot
*4u  -   Kiss for you
*67  -   unknown
*eg*  -   evil grin
07734  -   hello';

或者,您可以反斜杠转义\$"\$#!+ -..."