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...
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.
Kiitos nopeasta vastauksesta. Tuo ylempi esimerkkisi toimii. Tuosta toisesta en hoksaa, mistä tuo muuttuja $m tulee..?
Sitten kannattaa varmaan ottaa selvää, vai mitä?
On tässä vielä outo vika, ei tulosta ollenkaan muuttuja nimiä...
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..?
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.
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!
Aihe on jo aika vanha, joten et voi enää vastata siihen.