Napisałem skrypt, który zamienia znaczniki bbcode na html:
<?php
function BBcodeOut($object)
{
'![url[=]?(.*?)?](.*?)[/url]!sie',
'!(.*?)!sie',
'!(.*?)!sie',
'!(.*?)!sie',
'![quote[=]?(.*?)?](.*?)[/quote]!sie',
'!(.*?)!sie',
'!(.*?)!sie',
);
'\"<a href=\"http://\". str_replace( \"http://\", \"\", ( \"$1\"==\"\"?\"$2\":\"$1\" ) ) .\"\" target=\"_blank\">\". ( strlen( \"$2\" )>25?substr( \"$2\", 0, 10 ).\"...\".substr( \"$2\", -10 ):\"$2\" ) .\"</a>\"',
'\"<strong>$1</strong>\"',
'\"<i>$1</i>\"',
'\"<u>$1</u>\"',
'( \"$1\"!==\"\"?showUsername( \"$1\" ).\" <strong>napisał(a):</strong><br />\":\"<strong>Cytat:</strong><br />\" ) .\"<div class=\"quote_box\">$2</div>\"',
'\"<span style=\"color:$1;\">$2</span>\"',
'\"<span style=\"font: 10px $1;\">$2</span>\"',
'\"<ul>\". str_replace( \"[/*]\", \"</li>\", str_replace( \"[*]\", \"<li>:arrow: \", \"$1\" ) ) .\"</ul>\"'
);
return $object;
}
?>
Problem polega na tym, że opisałem stronę XHTML'em, a wiadomo że jeśli znaczniki krzyżują się wyświetli się drzewko zamiast strony. Aby temu zapobiec postanowiłem napisać blokadę przed mieszaniem tagów. Oto co wymyśliłem:
<?php
function safeBBcode( $object )
{
$rozbity = preg_split( '!([/[*a-z]*])([^[^].]*?[[^/][*a-z]*=?.*?])!si', $object, -1
, PREG_SPLIT_DELIM_CAPTURE
);
for($x=0;$x<=count($rozbity);$x++) {
if($x == 0
|| $x == count( $rozbity ) ) {
$string = $rozbity[$x] . $rozbity[$x+1];
}
else
{
$string = $rozbity[$x] . $rozbity[$x+1]. $rozbity[$x+2];
$x++;
}
$y = count( $matches_1[1
] );
for($v=0;$v<count( $matches_1[1] );$v++)
{
$y--;
if( $matches_1[1][$y] !== $matches_2[1][$v] )
{
return $string;
}
}
$string = '';
$x++;
}
return 0;
}
?>
Nadal jednak nie działa w 100%... ma problem ze sprawdzaniem, jeśli wewnątrze jednego tagu zawarte są 2 lub więcej innych np:
Cytat
[aa][bb][/bb][cc][/cc][/aa]
Nie mam pomysłów jak to poprawić, więc proszę o pomoc (IMG:
http://forum.php.pl/style_emoticons/default/sad.gif)
Ten post edytował CzesLaW'ek 20.03.2005, 14:53:01