On tullut tässä koodailtua tommonen bb koodit html:ään muuttava php-koodi hyödyntäen säännöllisiä lausekkeita.
Törmäsin kuitenkin onglemaan, eli jos on kaksi tagia sisäkkäin se toimii vielä jos sisempi tagi muutetaan ensin html:lään, mutta jos ulompi tagi on ennen sisempää tagia muuntojärjestyksessä törmääkin heti ongelmiin(katso alla oleva koodi). Itse asiassa tämäkin ongelma on vain, jos kyseessä on bb koodi johon pannaan joitakin lisäparametrejä, kuten url tagi
[url=url]jotain[/url]
eikä tavallinen bb koodi esim.
[bouldaus]jotain[bouldaus]
Eli jos panen esim. näin
[size=15][color=blue]jee[/color][/size]
on tuloksena tämä:
<span style="font-size:15][color=blue]jee[/colorpx"></span>
Jos taas panen
[color=blue][size=15]jee[/size][/color]
on tuloksena:
<span style="color:blue"><span style="font-size:15px">jee</span></span>
eli juuri se mitä haluan.
Ymmäränkin miksi se tekee noin, mutta en keksi miten ongelman saisi korjattua. Enkä toivo mitään linkkejä valmiisiin bb-code parsereihin, sillä tämä käy ihan hyvästä harjoituksesta.
Tässä tulee koodi:
<?php function bb2html($text){ $patterns[0] = "/\[b\](.*)\[\/b\]/"; $patterns[1] = "/\[u\](.*)\[\/u\]/"; $patterns[2] = "/\[i\](.*)\[\/i\]/"; $patterns[3] = "/\[img\](.*)\[\/img\]/"; $patterns[4] = "/\[size\=(.*)\](.*)\[\/size\]/"; $patterns[5] = "/\[color\=(.*)\](.*)\[\/color\]/"; $patterns[6] = "/\[url\=(.*)\](.*)\[\/url\]/"; $patterns[7] = "/\[mail\=\"(.*)\"\](.*)\[\/mail\]/"; $patterns[8] = "/\[list\](.*)\[\/list\]/"; $patterns[9] = "/\[\*\]/"; $patterns[10] = "/\[code\](.*)\[\/code\]/"; $patterns[11] = "/\[center\](.*)\[\/center\]/"; $patterns[12] = "/\[left\](.*)\[\/left\]/"; $patterns[13] = "/\[right\](.*)\[\/right\]/"; $patterns[14] = "/\[url\](.*)\[\/url\]/"; $patterns[15] = "/\[mail\](.*)\[\/mail\]/"; $replacements[0] = "<b>\\1</b>"; $replacements[1] = "<u>\\1</u>"; $replacements[2] = "<i>\\1</i>"; $replacements[3] = "<img src=\"\\1\">"; $replacements[4] = "<span style=\"font-size:\\1px\">\\2</span>"; $replacements[5] = "<span style=\"color:\\1\">\\2</span>"; $replacements[6] = "<a href=\"\\1\">\\2</a>"; $replacements[7] = "<a href=\"mailto:\\1\">\\2</a>"; $replacements[8] = "<ul>\\1</ul>"; $replacements[9] = "<li>"; $replacements[10] = "<code>\\1</code>"; $replacements[11] = "<div align='center'>\\1</div>"; $replacements[12] = "<div align='left'>\\1</div>"; $replacements[13] = "<div align='right'>\\1</div>"; $replacements[14] = "<a href=\"\\1\">\\1</a>"; $replacements[15] = "<a href=\"mailto:\\1\">\\1</a>"; $text = preg_replace($patterns, $replacements, $text); return $text; } ?>
Kiitos avusta jo etukäteen!
Tuo b tagi on muutettu bouldaukseksi vain sen takia että ohjelmointiputka lihavoi koko tekstini. :)
Vaihtoehtoja on parikin: Parametri päättyy aina tiettyyn merkkiin, joten kohdan ".*" voi vaihtaa hyväksymään vain muut kuin lopetusmerkit: "[^]]*". Toisaalta tähän voi käyttää laiskaa hakua, ".*?", joka valitsee osumista sen, jossa ".*" sisältää mahdollisimman vähän tekstiä, normaalistihan lauseke toimii juuri päinvastoin.
Vinkki itse koodiin: Kahdella erillisellä taululla ja indeksoinnilla hajotat vielä pääsi tai koodisi. Olisiko tämä selkeämpi tapa?
<?php $korvaus = array(); // Samalle riville saadaan aina haettava ja korvaava. $korvaus["/\\[b\\](.*)\\[\\/b\\]/"] = "<b>\\1</b>"; // Lopuksi voidaan ottaa nämä helposti omiin taulukoihinsa. $patterns = array_keys($korvaus); $replacements = array_values($korvaus); ?>
Huomannet myös, että '\' täytyy kirjoittaa lainausmerkeissä muodossa "\\", eli esimerkiksi '\/' kirjoitetaan muodossa "\\/". Itse käytän tämän takia mieluummin 'hipsuja', joissa teksti pysyy sellaisenaan. Kaikissa patterns-taulukkosi riveissä on tämä ongelma.
Kiitoksia kaikista vinkeistä!
Olinkin ajatellut jotain tuollaista, mutta taisivat aivoini olla jostain syystä jäässä.
Eli loppuun vielä, että sain siis toimimaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.