|
Posted by "Sonia" on 07/30/05 20:58
This is what it needs to do!
The first tag that is found will set where the parser will insert '<!-- /
sc' before that tag. Any bbcode tags that are in the current tag will be
skipped over until the parser finds the end of the current bbcode tag it is
working on. Once it finds the end of the current tag it will insert 'sc
/ -->' after the end of the current tag. It will continue doing this until
no tags are left to be parsed in the string!
My script is below....
My question...
Is there a better way to do this?
// script!
<?
$res = array ( '<!-- / sc', 'sc / -->', '', '' );
$str = "[quote=tinyman,Jul 29 2005, 11:27 PM]
Visit my site www.site.com . It provide Email Service(4gb), Free Forum, Free
File Hosting, Free Webhosting and Free Blog hosting.
[b][right]149013[/right][/b]
[/quote][email][b]mm@mm.com[/b][/email][code]<? echo 'hi';
?>[/code]
jp
";
echo bbcode_phase ( $str, $res[0], $res[1] );
function bbcode_phase ( $text, $es, $ee )
{
$bb = array ( 'q' => '5|quote',
'r' => '5|right',
'e' => '5|email',
'h' => '4|html',
'p' => '3|php',
'f' => '4|font',
'l' => array ( '4|list', '4|left' ),
's' => '4|size', 'b' => array ( '2|b]|b', '5|bible' ),
'u' => array ( '2|u]|u', '3|url' ),
'c' => array ( '4|code', '5|color', '6|center' ),
'i' => array ( '2|i]|i', '3|img', '6|indent' ) );
$a = ''; // the output string holder
$b = array (); // the current tag info array
$c = 0; // where we are in the substr
$d = strtolower ( $text ); // lower case the string
while ( ( $e = strpos ( $d, '[' ) ) !== false )
{
$a .= substr ( $text, $c, $e );
$c += $e;
/* if we have a current tag do this */
if ( ! empty ( $b ) )
{
/* if we match the end of the current tag process it */
if ( substr ( $d, ( $e + 2 ), $b[0] ) == $b[1] )
{
if ( isset ( $b[2] ) ) // for bbcode tags ([b], [i] ... )
{
$a .= '[/' . strtoupper ( $b[2] ) . ']' . $ee;
$c += ( $b[0] + 2 );
$d = substr ( $d, ( $e + $b[0] + 2 ) );
}
else
{
$a .= '[/' . strtoupper ( $b[1] ) . ']' . $ee;
$c += ( $b[0] + 3 );
$d = substr ( $d, ( $e + $b[0] + 3 ) );
}
$b = array ();
}
else /* not a current tag substr 1 character forward */
{
$a .= substr ( $text, $c, 1 );
$d = substr ( $d, ( $e + 1 ) );
$c += 1;
}
}
else /* no current tag, find one if it is there */
{
$f = false;
$g = substr ( $d, ( $e + 1 ), 1 );
if ( isset ( $bb[$g] ) )
{
/*
* some tags have more than 1 value so they
* are arrays other are just string values.
*/
if ( is_array ( $bb[$g] ) )
{
for ( $i = 0; $i < sizeof ( $bb[$g] ); $i++ )
{
$b = explode ( '|', $bb[$g][$i] );
if ( substr ( $d, ( $e + 1 ), $b[0] ) == $b[1] )
{
$f = true;
break;
}
}
}
else
{
$b = explode ( '|', $bb[$g] );
if ( substr ( $d, ( $e + 1 ), $b[0] ) == $b[1] )
{
$f = true;
}
}
}
/* we have found a starting tag process it */
if ( $f )
{
if ( isset ( $b[2] ) ) // for bbcode tags ([b], [i] ... )
{
$a .= $es . '[' . strtoupper ( $b[2] );
$c += $b[0];
$d = substr ( $d, ( $e + $b[0] ) );
}
else
{
$a .= $es . '[' . strtoupper ( $b[1] );
$c += ( $b[0] + 1 );
$d = substr ( $d, ( $e + 1 + $b[0] ) );
}
}
else /* not a good starting tag substr 1 character forward */
{
$a .= substr ( $text, $c, 1 );
$b = array ();
$d = substr ( $d, ( $e + 1 ) );
$c += 1;
}
}
}
/*
* if the string has more characters after the last
* closing tag put back what is left...
*
*/
if ( ! empty ( $d ) )
{
$a .= substr ( $text, $c );
}
return ( $a );
}
?>
thanks
Sonia
[Back to original message]
|