Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: preg_replace pelaamaan dollareilla

Agony [14.01.2007 21:35:12]

#

Mikäköjän mahtaa olla vikana kun seuraava koodi:

<?php

$teksti = 'Muutetaan {-muuttuja-} tekstiksi';

$muuttuja = "hieno muuttuja";

echo preg_replace('/{-(.*?)-}/ime', "\$\\1", $teksti);

?>

pelittää paremmin kuin hyvin (tuloksena on siis "Muutetaan hieno muuttuja tekstiksi"), mutta heti kun otan mukaan dollarin (haluaisin selkeyden vuoksi merkitä sisältömuuttujan suoraan dollarilla) eli:

<?php

$teksti = 'Muutetaan {$muuttuja} tekstiksi';

$muuttuja = "hieno muuttuja";

echo preg_replace('/{\$(.*?)}/ime', "\$\\1", $teksti);

?>

ei enää toimikaan vaan tulostaa "Muutetaan {$muuttuja} tekstiksi". Nyt hakannut päätä seinään näinkin yksinkertaisen regexin kanssa jo kaksi tuntia, ja alkaa kikka-arkun pohja häämöttämään...

Codeprofile [14.01.2007 21:39:14]

#

Kokeile ilman noita väkäsiä. Jos ei auta, niin kokeile:

$teksti = "Muutetaan " . $muuttuja . " tekstiksi";

EDIT: Jos tuo preg_replace on tarkoitettu estämään joitakin merkkejä, poista listasta dollarit.

Agony [14.01.2007 21:43:07]

#

Testin vuoksi merkkijono on hipsuissa (' ja ') koska en nimenomaan halua että PHP parsii automaattisesti muuttujan. Tositilanteessa teksti tulee tietokannasta, ja että muuttuja saadaan pultattua tietokannasta tulevaan tekstiin, pitää se joko ajaa evalin tai preg_replacen läpi, ja jälkimmäinen on superturvallinen verrattuna evaliin... Kaarisulkeita taas en suostu ottamaan pois koska puhtaan dollarin tulostus muuttuu mahdottomaksi, tuolla koodilla vain {$} tulostaminen ei onnistu.

kayttaja-2791 [14.01.2007 21:52:01]

#

Eikö { merkitkin pidä escapettaa? Niillä kun on erikoismerkitys regexpeissä. Eli kokeilepa näin:

<?php

$teksti = 'Muutetaan {$muuttuja} tekstiksi';

$muuttuja = "hieno muuttuja";

echo preg_replace('/\{\$(.*?)\}/ime', "\$\\1", $teksti);

?>

Tosin en osaa sanoa miksi tuo ensimmäinen sitten toimisi...

Edit:
Kokeilinkin nyt noita itse, ja minulla toimii myös alkuperäinen versiosi.

Agony [14.01.2007 21:55:57]

#

Ei elämä, tämän siitä saa kun yrittää pää tyhjänä vääntää koodin kuntoon, kiitos JTS, toimii kuin unelma. Muistan kokeilleeni escapetettua versiota mutta tuolloin kokeilukierroksessa oli toisena arvona "\$$1" jolloin se ei toiminut... Takaisin sisällönhallinnan kimppuun :D

EDIT: Niin näköjään toimiikin tuo kakkosversioni, mutta ei localhostilla vaan ainoastaan palvelimella... minkäköhän php-asetuksen olen onnistunut vetämään killiin kotiphp:ltä... no, se olkoon joku toinen proggis :)

Antti Laaksonen [14.01.2007 21:56:46]

#

Minulla myös tuo jälkimmäinen koodi toimii toivotulla tavalla (PHP 4.3.2), samoin JTS:n koodi toimii. On kyllä vaikea ymmärtää, miksi ensimmäinen toimisi, mutta toinen ei. Toimiiko korvaus jollain muulla etumerkillä kuin dollarilla?

Jos muu ei auta, minä ehkä korvaisin säännöllisen lausekkeen for-silmukalla. Sen toimintaa pystyy ainakin tutkimaan tarkasti, ja tässä tapauksessa toteutus ei ole edes kovin monimutkainen.

Muoks. Hyvä, että ongelma ratkesi!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta