Miten voisi tehdä code-bbcoden, joka värjäisi php-koodin code- ja /code-tagin välillä, niin että se menisi omaan boksiinsa?
strpos funkkarin avulla ainakin. Mitä tarkotat tolla "et se menis omaan boksiinsa"? Sellanen niinku täällä on [koodi] ?
Just sellane
$teksti = preg_replace("/\[code\](.*?)\[\/code\]/i", "<code>$1</code>", $teksti);
Tuotako ajoit takaa?
Värittääkö se tekstin?
Ai miten värittääkö? Ai meinaatko niinkuin täällä putkassa php-koodin värjäys? No ei. Siihen tarkoitukseen käy php:n oma highlight_string-funktio.
Silloin se värittää koko viestin, ei pelkästään code- ja /code-bbcodejen välissä olevaa. Pitäisi saada se värittämään ainoastaan ne mitkä on bbcodeilla merkitty.
haetko nyt highlight_string() -funkkaria?
esim.
<?php $seppo = "<?php print\"OMG\"; ?>"; highlight_string($seppo); ?>
En vaan sitä että miten sen saisi värittämään vain ja ainoastaan ne kohdat mitkä ovat code- ja /code-bbcodejen välissä!!
Mite ois ensin sen tekstin (mikä on tagien välissä) ettiminen ja sen ajaminen highlight_string funkkarin läpi?
Koodiosuuden värittäminen tageilla rajatulta alueelta on vähän vaikeampi juttu (mikä on tullut myös tällä keskustelualueella esille erinäisinä bugeina!). Näin se kuitenkin tapahtuu:
Etsi ensin viestistä koodiosuuden aloitus- ja lopetustagi (strpos). Sitten poimi erilleen niiden välissä oleva osa (substr) ja tee sille tarvittavat väritykset. PHP-värityksen tekeminen onnistuu tosiaan helposti highlight_string-funktiolla. Apua löytyy tämän koodivinkin kommenteista:
https://www.ohjelmointiputka.net/koodivinkit/
Muut väritykset täytyy luonnollisesti tehdä itse. Kun väritykset on tehty ja olet laittanut koodipätkän ympärille muutenkin tarvittavat HTML-tagit, täytyy pätkä enää liittää osaksi alkuperäistä viestiä. Tämä onnistuu jälleen substr-funktion avulla (viestin alku - koodiosuus - viestin loppu). Varo kuitenkin sitä, että skripti ei jää ikuiseen silmukkaan, jos kooditagin vastapari on unohtunut viestistä!
Tuossahan irksome sen vastauksen jo antoi.
$teksti = preg_replace("/\[code\](.*?)\[\/code\]/i", "<code>$1</code>", $teksti);
Lisätään tähän se highlight_string ja muutetaan vähän tuota regexpiä, että se natsaa myös silloin kun code-tagien sisällä on rivinvaihtoja, niin saadaan
$teksti = preg_replace("/\[code\](.*?)\[\/code\]/is", highlight_string("$1",true), $teksti);
Niin ja tällainen imo, että opetelkaa niiden regexpien käyttö. Huomattavasti helpompaa ja varmempaa tekstien parsetus niillä, kuin että itse väsätään purkkafunktiot strpossin, substringin ja muiden stringien käsittelyyn tarkoitettujen funktioiden avulla.
Äh, ei se käynytkään ihan noin helposti mitä aluksi ajattelin. Tuo muokkaus nappulakin jo jumittunut, joten postaan tähän toimivamman ratkaisun.
<?php $teksti = preg_replace_callback ( "/\[code\](.*?)\[\/code\]/is", create_function ( '$teksti', 'return highlight_string( $teksti[1] ,true);' ), $teksti ); ?>
Tämä siis värittää mistä tahansa tekstistä löytyvän [code] -tagien välin, jos sieltä koodia löytyy.
Tuo tapa on tosiaankin parempi! Kiitos vinkistä, en tiennyt että regexpiin on mahdollista yhdistää funktio. Ja näemmä hightlight_stringin tulostuksenkin saa nykyään suoraan muuttujaan ilman eri kikkoja.
Noista regexpeistä vielä sen verran, että joku halukas vois tehä niistä ihan oman oppaan putkaan. Aina kun olen niitä tarvinnut, olen yrittänyt selvittää niiden syntaxia, mutta ei vain ole tähän pääkoppaan uponnut.
edit: No hyvä ystävämme Google auttaa myös tähän ongelmaan näköjään :)
ajv kirjoitti:
Noista regexpeistä vielä sen verran, että joku halukas vois tehä niistä ihan oman oppaan putkaan.
Kannatan. Ehkäpä ne kerranki tulis opeteltua, jos Putkassa olis laadukas opas.
create_function -funkkaria kannattaa välttää, ainakin mitä on uskominen php.net:n manuaaliin. Mutta preg_replace:n yhteydessä on myös mahdollista käyttää callback-funktiota, jos oikein muistan niin tähän tyyliin:
$teksti = preg_replace("/\[code\](.*?)\[\/code\]/ems", "highlight_string('\\1',true)", $teksti);
ederth kirjoitti:
create_function -funkkaria kannattaa välttää, ainakin mitä on uskominen php.net:n manuaaliin. Mutta preg_replace:n yhteydessä on myös mahdollista käyttää callback-funktiota, jos oikein muistan niin tähän tyyliin:
$teksti = preg_replace("/\[code\](.*?)\[\/code\]/ems", "highlight_string('\\1',true)", $teksti);
Tuota e modifieriä kokeilin kans, mutta se jotain bugaili. Tuon create_function -ongelman voinee ratkaista niin, että tekee siitä oman erillisen funktion, jonka sitten sijoittaa tuohon preg_replace_callbackkiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.