$ <char> in string wordt geïnterpreteerd als variabel ... hoe te omzeilen?

Beschouw het volgende bestand (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

Ik wil deze voorwaarden in een database stoppen. Hiervoor moet ik eerst de tekst splitsen in sleutelwaardeparen die worden opgeschoond. Hiervoor heb ik de inhoud van slang.txt naar een php-bestand gekopieerd:

$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);

Het resultaat is er bijna:

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?

Postscriptum Het eigenlijke bestand is veel, veel groter, dus ik kan echt niet over de inhoud heen gaan en aan alle $ 's of zoiets ontsnappen, noch de string tussen enkele haakjes plaatsen (omdat dat de string zou breken als er (en er zijn) er worden woorden gebruikt die een apastrophe bevatten :)

0
U had een meer gezinsvriendelijk voorbeeld kunnen geven ...
toegevoegd de auteur BoltClock, de bron
Yeesh ... niet alle antwoorden ook opruimen. De vraag is tenminste een beetje schoongemaakt.
toegevoegd de auteur Marc B, de bron
Ik vind de handleiding behoorlijk spraakzaam over deze en gerelateerde dingen hier: php.net/manual /en/language.types.string.php - @BoltClock: seks per definitie is gezinsvriendelijk.
toegevoegd de auteur hakre, de bron
@BoltClock Het aantal kinderen op StackOverflow is waarschijnlijk verwaarloosbaar.
toegevoegd de auteur GolezTrol, de bron

4 antwoord

Gebruik enkele aanhalingstekens voor de string:

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

Je zult aan enkele aanhalingstekens in de string moeten ontsnappen, maar die zijn misschien minder gebruikelijk. Zo niet, dan zul je aan het lot moeten ontsnappen.

Of een nog betere oplossing: sla deze tekst op in een apart bestand en lees het in met een string met file of file_get_contents .

5
toegevoegd
Ik zou niet zo ver gaan om te downvoten, maar hoewel dit het probleem oplost, is het geen goede oplossing. Hoe zit het met het opleiden van de OP een beetje?
toegevoegd de auteur Jon, de bron
Geen goede oplossing = alles met betrekking tot het kopiëren van de inhoud van een tekstbestand in een PHP-bron om het alleen tijdens runtime verder te verwerken.
toegevoegd de auteur Jon, de bron
Het feit blijft dat de huidige vorm van dit antwoord suggereert te gaan met een benadering dat IMHO geen huurmateriaal is. Het is beter voor iedereen om het antwoord te verbeteren of uit te breiden in plaats van hier een discussie met me te hebben :-)
toegevoegd de auteur Jon, de bron
Wat is geen goede oplossing? De snelle oplossing met enkele aanhalingstekens of het advies om de gegevens in een afzonderlijk bestand te plaatsen?
toegevoegd de auteur GolezTrol, de bron
Dat is waarom ik heb voorgesteld om in een apart bestand te plaatsen. Je zou al in de bron kunnen stoppen als een array, maar dat betekent dat je eigenlijk code aan het schrijven bent als je de array wilt uitbreiden. En goed, ik denk dat elke PHP-programmeur het verschil tussen enkele en dubbele aanhalingstekens moet kennen, dus zelfs als enkele aanhalingstekens in dit geval niet de beste oplossing zijn, zou het niet verstandig zijn om het hier niet te vermelden.
toegevoegd de auteur GolezTrol, de bron
Ik heb het gevoel dat ik het genoeg heb genoemd, en je hebt al gepleit voor afzonderlijke bestanden, waarmee je mijn upvote hebt verdiend. Maar het geaccepteerde antwoord laat zien hoe het OP denkt over goede oplossingen. ;-)
toegevoegd de auteur GolezTrol, de bron

In plaats van alleen enkele aanhalingstekens te gebruiken, zou het nog beter zijn om NOWDOC te gebruiken. In dat geval hoeft u helemaal niet te ontsnappen, zelfs als uw strings ' bevatten en de eerste en laatste regel gemakkelijker te lezen zijn.

$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
toegevoegd

Het eenvoudige antwoord zou zijn om een ​​enkele geciteerde string letterlijk te gebruiken (of beter NOWDOC-syntaxis ).

Maar dit negeert het feit dat je dit gaat doen op een echt heel omweg . Waarom zou je de inhoud van het bestand naar een PHP-variabele verplaatsen als je het kunt doen

$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
toegevoegd
Ik wist over HEREDOC, maar niet over NOWDOC. Ik heb vandaag iets geleerd, waarvoor ik je bedank.
toegevoegd de auteur GolezTrol, de bron

Als u de tekenreeks alleen definieert met enkele aanhalingstekens ' in plaats van dubbele aanhalingstekens ", wordt voorkomen dat de $ s worden geïnterpreteerd als variabelen:

$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
toegevoegd