Eli siis minulla on tällainen vieraskirja viritys, jossa käyttäjä pystyy lisäämään i, b ja u tageja (Oikeasti noi kaikki olisivat hakasulkeissa, mutta jos laittaisin tässä ne niin...). Kuitenkin on mahdollista, että käyttäjä jättää auki jonkun tagin. Ne pitäisi tietenkin sulkea, ettei koko loppu sivu menisi pilalle. Tässä on oma viritykseni[/u]![/u]
<?php function ch($mark, $message) { $open = substr_count($message, "[{$mark}]"); $close = substr_count($message, "[/{$mark}]"); if($open != $close) { if($close < $open) { $ra = $open - $close; for($i=0; $i < $ra; $i++) { $message = $message . "[/{$mark}]"; } } else { $ra = $close - $open; for($i=0; $i < $ra; $i++) { $message = "[{$mark}]" . $message; } } } return $message; } ?>
Tuota siis käytellään tähän tapaan:
<?php $message = ch("i", $message); $message = str_replace(array("[i]", "[/i]"), array("<em>", "</em>"), $message); ?>
Ongelma on se että tuo ei sulje noita tageja oikeassa järjestyksessä, mikäli sinulla on useampia tageja käytössä. (Esimerkissä oli pelkkä i-tagi, mutta oikeasti niitä on minulla enemmän)
edit: unoihtui, että putkassakin on käytössä samat tagit
Jos kerran voidaan olettaa, että käyttäjä saattaa jättää tageja auki, niin mielestäni on myös mahdollista, että käyttäjä kirjoittaa tageja muutenkin väärään järjestykseen. Itse olen käynyt tagit yksitellen lävitse pitäen samalla kirjaa jo aukaistuista tageista. Näin lopputuloksesta on aina mahdollista tehdä oikeaoppinen. Huonona puolena tässä tavassa on (varmaankin) hitaus verrattuna sisäänrakennettujen funktioiden käyttöön.
Noin sen kummemmin miettimättä sanoisin, että preg_split hajottajaksi, jokaiseen palaan merkintä siihen vaikuttavista tageista, sitten pikaiset laskelmat siitä, milloin tagit pitää avata ja sulkea ja lopuksi koko teksti takaisin kokoon. Eihän noita kuitenkaan aivan järjettömästi tarvitse suorittaa, aina vain viestiä muokattaessa. Nopeampiakin tapoja varmasti löytyy, enkä näin äkkiseltään osaa tuonkaan toteutuksen hankaluutta arvioida.
Joo, kiitti vastauksista. Jään tähän miettimään parasta tapaa. Luultavasti luen kaikki tagit arrayhyn, sen sitten looppaan ja tarkistan onko tagit suljettu oikeassa järjestyksessä, mitä tageja puuttu. Sitten vaan laitan ne oikeisiin kohtiin...
Laiska pääsee vähemmällä ja käyttää taulukoita
<table> <tr> <td> <b>virheellinen tagi </td> </tr> <tr> <td> normaalia tekstiä </td> </tr> </table>
Mmmm ah, preg <3 pääsee niin helpolla...
Jotenki näin näyttäis näin pikaisesti kokeillen toimivan preg_replacella: http://sooda.dy.fi/bbkode.php
Nii, ja käytetään semanttisesti korrekteja elementtejä, eikä mitään b:tä tms.
Aihe on jo aika vanha, joten et voi enää vastata siihen.