Onko kukaan joutunut tekemisiin semmoisen ongelman kanssa, että jos joku haluaa kirjoittaa viestiin koodia, joka sisältää muotoilu-tageja, esim:
[url][/url][b][/b]
Miten ne saa tulostettua viestissä niin ettei ohjelma muuta niitä esim. linkeiksi, taulukoksi tai muuksi?
[table][tr][td][b]Miten olette hoitanut tuon homman?[/b][/td][/tr][/table]
Edit: Tässäkin on vähän "ylimääräisiä muotoiluja", joita ei näy tuolla ohjeissa. :) Tarkoitan sitä, miten saa tulostettua noin?
Jos oikein muistan niin tuo onnistuu str_replace(); -funktiolla. Funktion ensimmäinen parametri on merkkijono, jotka korvataan. Toinen parametri on merkkijono, jolla ne korvataan. Ja viimeinen parametri on teksti, josta korvattavaa etsitään. Esimerkiksi sinun tapauksessa homma voisi mennä näin:
<?php $temp = str_replace("[table]", "<table border='0'", $teksti); $temp = str_replace("[tr]", "<tr>", $teksti); $temp = str_replace("[td]", "<td>", $teksti); $temp = str_replace("[b]", "<b>", $teksti); $temp = str_replace("[/b]", "</b>", $teksti); $temp = str_replace("[/td]", "</td>", $teksti); $temp = str_replace("[/tr]", "</tr>", $teksti); $temp = str_replace("[/table]", "</table>", $teksti); echo $temp; ?>
Tuossa pätkässä muuttuja $teksti sisältää tekstin, joka pitää tutkia. Muuttuja, johon muutettu teksti laitetaan, on $temp.
Jos olet tekemässä boardia yms, niin suosittelen viestin tallentamista tietokantaan / flatfileen siinä muodossa, miten sen kirjoittaja on sen kirjoittanut. Sitten vasta sivun latausvaiheessa PHP muuttaa kooditagit tuolla str_replace(); -funktiolla.
Muista tarkistaa, löytyykö esimerkiksi lihavoinnille lopetustagi, sillä muuten se sotkee koko sivun. (pahimmassa tapauksessa)
Kiitoksia vastauksista. Saattaa olla, että käsititte väärin tuon minun hataran kysymyksen.
Olen tehyt tuon muotoilun preg_replacella ja str_replacella. Tarkoitin sitä, että viestinkirjoittaja kirjoitaa code-tagien väliin jotakin muotoilu-tageja, joita ei ole tarkoitettu muotoilemaan viestiä, vaan olemaan osa koodia.
Esimerkki:
[b]tässä näkyy b-tagi eikä lihavointi[/b]
Sain tuon nyt toimimaan jollakin tavalla, että ei näytä code-tagien välissä esim. tuollaista muotoilua....
Helpoiten se kai käy, kun vain jätät tuon string_replacen kokonaan ajamatta vaikka tietyn elementin sisällä olevalle teksille. Voit kokeilla vaikka erotella sen toiseen muuttujaan, ajaa lopuille string_replacet ja sitten ympätä tekstin taas takaisin.
Tein tämän mutkikkaasti: erottelin
[codes][/codes]
-merkkien välisen tekstin $sisalto muuttujaan, jonka sisällön käsittelin str_replacella niin ettei siihen jäänyt muotoilu-tagien merkkijonoja ja lopuksi, kun koko viestin muotoilut oli tehty, muutin ne uudelleen muotoilu-tageiksi... :9
Huono puoli on ainakin se, että siinä on melkoisesti koodia...
Jos oppisi käyttämään preg_replacea paremmin, niin se lyhentäisi koodia huomattavasti...
Esimerkiksi merkkijono:
[table bgcolor=black]
Miten tuon muuttaa preg_replacessa muotoon
<table bgcolor="black"><tr><td>
Siinä tuo taustanväri nimittäin on viestin kirjoittajan valitsema mikä tahansa html-sopiva väri tai värinumero.
Kysytään samantien seuraavaa, vielä visaisempaa:
[table border=15?bgcolor=E17100?bordercolor=brown] Tekstiä [/table]
<table border="6" bgcolor="E17100" bordercolor="brown"><tr><td> Tekstiä </td></tr></table>
Miten tuon saa preg_replacella muutettua noin?
Heitän hatusta, mutta kokeileppa seuraavaa:
$data = preg_replace("/\[table border=(.*?)\?bgcolor=(.*?)\?bordercolor=(.*?)\](.*?)\[\/table\]/i", "<table border=\"$1\" bgcolor=\"$2\" bordercolor=\"$3\"><tr><td>$4</td></tr></table>", $data);
toimii!!
Kiitos paljon.... Olli
:?
Huomasin juuri preg_replacessa uuden piirteen:
Mitään muotoilu-tageja, joiden muotoilu suoritetaan preg_replacella, ei tarvitse muuttaa str_replacella ennen muotoilua, kun ne ovat code-tagien välissä.
Oliko selitetty monimutkalaisesti?
Aihe on jo aika vanha, joten et voi enää vastata siihen.