文字列の$ <char>は変数として解釈されます...回避するには?

次のファイル(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
)

Problem: the "$" terms (such as $h in $h!t and $xy) are interpreted as variables and therefore not copied to the array see: [!t] => shit and [] => sexy instead of [$h!t] => shit and [$xy] => sexy. How can I resolve this?

P.S.実際のファイルははるかに大きいので、実際にはすべての$や何かをエスケープすることはできませんし、文字列を単一の括弧で囲むこともできません。アポストロフィを含む単語が使用されています:)

0
あなたは家族に優しい例を提供することができました...
追加された 著者 BoltClock,
Yeesh ...すべての答えもきれいにするつもりはない。少なくとも質問はちょっときれいだった。
追加された 著者 Marc B,
私はこのマニュアルや関連するものについてここではかなり話題になっています: php.net/manual /en/language.types.string.php - @BoltClock:定義ごとの性別は家族向けです。
追加された 著者 hakre,
@BoltClockおそらくStackOverflow上の子の数は無視できます。
追加された 著者 GolezTrol,

4 答え

文字列には一重引用符を使用します。

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

文字列の中で一重引用符をエスケープする必要がありますが、あまり一般的ではありません。もしそうでなければ、あなたは多くをエスケープする必要があります。

あるいは、このテキストを別のファイルに保存し、 file または file_get_contents を使用して文字列で読み込むこともできます。

5
追加された
私はdownvoteまでは行かないだろうが、これは問題を解決するが、良い解決策ではない。 OPを少し教えるのはどうですか?
追加された 著者 Jon,
良い解決策ではない=テキストファイルの内容をPHPソースに貼り付けるだけで実行時にそれをさらに処理することを含む何か。
追加された 著者 Jon,
実際のところ、この回答の現行形式は、IMHOが無償の資料であるというアプローチを提案しています。私とここで議論するのではなく、誰もが答えを向上させたり拡張したりするのが良いでしょう:-)
追加された 著者 Jon,
良い解決策ではないのは何ですか?一重引用符を使用したクイックフィックス、またはデータを別のファイルに保存するようアドバイスしますか?
追加された 著者 GolezTrol,
そういうわけで私は別のファイルに入れることを提案しました。ソースとして既に配列として配置することもできますが、配列を拡張するときに実際にコードを記述していることを意味します。とにかく、私はすべてのPHPプログラマは、一重引用符と二重引用符文字列の違いを知っている必要がありますので、一重引用符がこの場合に最適な解決法ではない場合でも、ここでそれを言及することはできません。
追加された 著者 GolezTrol,
私は十分にそれを言及したと感じ、あなたはあなたが私のupvoteを獲得している別のファイルを既に訴えてきました。しかし、受け入れられた答えは、OPが良い解決策についてどのように感じているかを示しています。 ;-)
追加された 著者 GolezTrol,

一重引用符を使用するのではなく、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;
3
追加された

簡単な答えは、一重引用符で囲まれた文字列リテラル(またはより便利に NOWDOC構文を参照してください)。

しかしこれは、あなたが本当に本当にラウンドアバウトな方法でこれについて行っているという事実を無視しています。あなたができるときにファイルの内容をPHP変数に移動する理由

$list = file('slang.txt');
$result = array();

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

print_r($result);

If you are thinking that loading up an external file each time is undesirable, that's OK. Why don't you write the array $result itself as a literal and save even more time?

echo var_export($result);//and copy/paste this into your PHP source
2
追加された
私はHEREDOCについて知っていましたが、NOWDOCは知りませんでした。私は今日何かを学びました。それに感謝します。
追加された 著者 GolezTrol,

ダブルクォート "の代わりに一重引用符 'を使用して文字列を定義するだけで、 $

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

Alternatively, you can backslash escape them \$: "\$#!+ -..."

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com