Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: preg_replace - Jyrääkö?

pistemies [11.12.2011 16:54:50]

#

Tämmöinen olis pikku ongelma.
Tätä olen käyttänyt tavallisten merkkirn korvaamisessa.

$str = preg_replace("/\[code\](.*?)\[\/code\]/i", koodi("$1"),$str);

Siihen pitäisi saada toimivaksi myös rivinvaihdot ja kaikki tarpeellinen...kyseessä on koodien värityshomma, miten tuon lauselman tulisi kuulua? Nythän tuo piste ymmärtääkseni estää rivinvaihdot...

Metabolix [11.12.2011 16:58:01]

#

Laita loppuun i:n kaveriksi s.

Tämä ei suinkaan ole ainoa virhe. Nythän koodisi ensin ajaa funktion koodi("$1") ja sitten korvaa kaikki kooditagit tämän funktion palauttamalla tekstillä. Varmaan tarkoitit kirjoittaa näin:

$str = preg_replace("/\[code\](.*?)\[\/code\]/ise", "koodi('$1')", $str);

Minusta preg_replace_callback on näissä tilanteissa selvempi kuin preg_replace.

function koodi_cb($m) {
  return koodi($m[1]);
}
$str = preg_replace_callback("/\[code\](.*?)\[\/code\]/ise", 'koodi_cb', $str);

Tuollaisella menetelmällä tehdystä muotoilusysteemistä löytyy yleensä koko joukko XSS-aukkoja, joiden kautta voi tehdä kaikkea kurjaa, ja muita bugeja, jotka aiheuttavat HTML-koodiin virheitä monissa vähänkin mutkikkaammissa tapauksissa. Suunnittele ja testaa kunnolla tai käytä jotain laadukasta valmisversiota.

pistemies [11.12.2011 17:10:35]

#

Kiitos nopeasta vastauksesta. Tuo ylempi esimerkkisi toimii. Tuosta toisesta en hoksaa, mistä tuo muuttuja $m tulee..?

Metabolix [11.12.2011 17:17:41]

#

Sitten kannattaa varmaan ottaa selvää, vai mitä?

pistemies [11.12.2011 17:40:57]

#

On tässä vielä outo vika, ei tulosta ollenkaan muuttuja nimiä...

# esim tämä rivi
$muuttuja = 55;
# tulostuu näin
=55;

# ja tämä
while($muuttuja){
#näin
while(){

Tuo koodi-funktio on ollut minulla käytössä jo yli 5 vuotta, joten vika ei liene siinä, mutta missä?

Ps. Tässä kuitenkin vielä tämä funktio

 function koodi($teksti) {
     $codes = explode("\n",$teksti);
     $puh = array();
   for($i=0;$i<count($codes);$i++){
       $text = $codes[$i];
       $text = wordwrap($text,75,"\n",20);
      array_push($puh,$text);
   }
     $script = implode("\n",$puh);
   return '<div class="php-koodi">'.highlight_string(html_entity_decode($script), true).'</div><br/>';
}

Ps 2. Välillä tulee Parse error ja fatal_error.... käytössä on siis tuo preg_replace esimerkki.

Parse error: syntax error, unexpected '&', expecting T_STRING or T_VARIABLE
or T_NUM_STRING in /home/etunimi/......tiedosto.php(58) : regexp code on line 4

Mille riville tuo code on line 4 mahtaa viitata..?

Metabolix [11.12.2011 18:20:29]

#

Eikö ongelma ole aika ilmeinen? Korvauslausekkeesi yrittää tavalla tai toisella parsia tai suorittaa muotoiltavan koodin. Et kai käytä "-merkkejä $1:n ympärillä?

Tuossa on jo yksi erittäin hyvä syy käyttää sitä preg_replace_callbackia: ei tarvitse arvailla, mitä korvattavalle tekstille tapahtuu.

pistemies [11.12.2011 18:29:11]

#

Olihan minulla ne niin päin kuin tuossa ekassa esimerkissäni... mutta nyt kun hipsut ym. siten kuin sinulla, niin ei käy lainkaan hommaa läpi koodi-funktiossa.

Tarkalleen homma on näin.

$str = preg_replace("/\[code\](.*?)\[\/code\]/ise", "stripslashes(koodi('$1'))", $str);

Tuo stripslashes tuossa ei hommaa häiritse, olen testannut.

Ps. jotain outoa tässä nyt on... kun testasin tätä omassa testi.php tiedostossa, toimi oikein, mutta tällä "isolla sivulla" ei... :)

Nyt tämän sain onnistummaan... kiitoksia!

Vastaus

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

Tietoa sivustosta