PDA

Pogčedajte punu verziju : Formatiranje teksta uz pomoc custom tagova


Bojsi
28. 02. 2008., 21:47
Pozdrav,

Pravim php skritpu koja parsira custom "[ tag ]" tagove (slicne kao na ovom forumu) uz pomoc sledece tehnike:


$Patterns[] = "|\[code\](.*?)\[/code\]|s";
$Patterns[] = "|\[url\](.*?)\[/url\]|s";
$Patterns[] = "|\[url=(.*?)\](.*?)\[/url\]|s";

$Replaces[] = "<div class=\"code\">\$1</div>";
$Replaces[] = "<a href=\"$1\" target=\"_blank\" title=\"$1\">\$1</a>";
$Replaces[] = "<a href=\"$1\" target=\"_blank\" title=\"$1\">\$2</a>";

echo nl2br(preg_replace($Patterns, $Replaces, $Text));


Kao sto mozete videti u kodu, uz pomoc nl2br funkcije najpre pretvaram svaki novi red u </ br> tag, a zatim parsiram ostatak teksta uz pomoc preg_replace funkcije.

Problem mi nazalost nastaje kod [ code ] tagova gde bih zeleo da izbegnem efekat nl2br funkcije, vec da tekst ostane pre-formatiran (kao kod upotrebe pre taga).

Da li je nekako moguce to odraditi, tj. iskljuciti nl2br unutar nekih tagova? Nisam siguran da li se nekako nl2br funkcija moze zaobici i sve uraditi uz pomoc regularnih izraza, ali mozda nekom to da ideju :)

Hvala unapred na svakoj pomoci.

ivanhoe
29. 02. 2008., 11:51
prvo da te upzorim, ovo tvoje nece raditi sa ugnjezdenim tagovima, [ x ] [ x ] [ /x ] [ /x ] ce da rezultira u <x></x>

koristi preg_replace_callback, i pogledaj u php helpu za tu funkciju imas bas primer parsiranja ugnjezdenih BB tagova. Tom funkcijom takodje mozes da resis i ovaj problem sa nl2br, tako sto ces da pogledas koji je tag u pitanju, pa ako je [ code ] onda neces da pozoves nl2br

(NOTE: morao sam da dodam extra spejsove u bbcode zbog foruma)

bluesman
29. 02. 2008., 12:34
(note, ako se dobro secam postoji bbcode .... )

Evo da probam: bold koji nije bold

Bojsi
29. 02. 2008., 12:59
Hvala na pomoci,

Uspeo sam uz tvoju pomoc da nadjem tu funkciju. Ali, nazalost nisam uspeo da maknem malo dalje sto se tice mog problema :(

Evo te funkcije sa php.net sajta jos jednom:


<?php
$input = "plain deep deeper deep plain";

function parseTagsRecursive($input)
{

$regex = '#\((?:[^[]|\[(?!/?indent])|(?R))+)\#';

if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}

return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;
?>


Verujem da se ova $regex varijable moze postaviti kao niz gde bih mogao da resim svaki tag ponaosob, ali kako da kasnije razdvojim te tagove i svaki obradim na svoj nacin.

Kod preg_replace mi je ta stvar bila nesto jasnija, ali ovde sam potpuno zbunjen :(

Hvala jos jednom na pomoci