?
Solved

take alook at my code

Posted on 2008-11-15
13
Medium Priority
?
177 Views
Last Modified: 2012-05-05
i have tracked it down to this file... for some reaosn [quote] and [url] are not working within my bbcode... can any1 see why?
<?php
 
class BBCode {
     protected $bbcodes; // Store array of BBCodes
     protected $vbbcodes; // Store array of Variable BBCodes
     var $debug = ''; // Store any errors
     var $selection = ''; // Store the selection to be parsed first
     var $parsed = ''; // Store the parsed selection.
     var $path2emoticon = 'http://www.runningprofiles.com/emoticons/'; // Set the path to the emoticon images.
     var $imgext = '.gif'; // Set this to the ext of the images
     public $emoticons = 
          array( '::)' => 'Roll Eyes', ':)' => 'Smiley', ';)' => 'Wink', ':D' => 'Cheesy', ';D' => 'Grin', '>:(' => 'Angry',
          ':(' => 'Sad', ':o' => 'Shocked', '8)' => 'Cool', '???' => 'Huh', ':P' => 'Tongue', ':-[' => 'Embarrassed', 
          ':-X' => 'Lips Sealed', ':-\\' => 'Undecided', ':-*' => 'Kiss', ':*(' => 'Cry' ); 
          // All emoticons. Spaces and caps will be removed for image names.
     
     function parseCode($security=0) { // Security defaults to 0. Set to 1 for non-variable bbcodes only.
          if(!$this->selection) { // Check if the user has set the selection.
               $this->debug .= "You must set a value for the selection before parsing! "; // Set the Debug variable if not.
          }else{
               if($this->parsed) { // Check if text has already been parsed.
                    $this->debug .= "You must run the code parser before the emoticon parser! "; // Set the Debug variable if so.
               }else{
                    $selection = str_replace("\n", '', $this->selection); // Set selection variable for inside function only.
                    $selection2 = htmlentities(str_replace("\n", '', $this->selection)); // Remove html entities for security.
                    $this->selectCodes($security); // Select codes depending on security.
                    #### Start [code] Section ###
                    preg_match_all("/\[code\].+\[\/code\]/Ui", $selection2, $matches); // Check for [code] tags. Set the matches array.
                    $i = 0; // Set the variable to the default of 0.
                    while(isset($matches[0][$i])) { // Check for match from preg_match.
                         $selection = str_ireplace(html_entity_decode($matches[0][$i]), "[code$i]", $selection); // Decode and replace for strip tags.
                         $i++; // Add one to the variable to loop.
                    }
                    $selection = strip_tags($selection); // Strip tags from the selection.
                    while($i>0) { // Reloop through matches.
                         $i--; // Remove one from the variable to loop.
                         $m = html_entity_decode($matches[0][$i]); // Decode the match for accurate removal.
                         $m = str_ireplace("[code]", "", $m); // Remove [code] tag.
                         $m = str_ireplace("[/code]", "", $m); // Remove [/code] tag.
                         $m = highlight_string($m,true); // Highlight string and encode.
                         $selection = str_ireplace("[code$i]", "[code]" . $m . "[/code]", $selection); // Add highlighted code back with tags for later parsing.
                    }
                    #### End [code] Section ####
                    ### Start BBCode Section ###
                    foreach ($this->bbcodes as $key => $value) { // Loop through bbcodes.
                         $selection = str_ireplace($key, $value, $selection); // Replace the $key value(bbcode) with the $value value(html code).
                    }
                    #### End BBCode Section ###
                    ### Start Var. BBCode Sec. ##
                    if($security==0) { // Only loop through if security allows it.
                         foreach ($this->vbbcodes as $key => $value) { // Loop through variable bbcodes.
                              unset($matches); // Unset matches set in earlier code.
                              $i = 0; // Set the variable to the default of 0.
                              preg_match_all($key, $selection, $matches); // Find all instances of the variable bbcode set them to matches.
                              // Preg Matching also stores the "variables" inside the matches var. with the matches.
                              while(isset($matches[0][$i])) { // Check if there are any instances.
                                   $v = str_replace("*", $matches[1][$i], $value); // Replace the asterisk with the variable value.
                                   if(isset($matches[2][$i])) { // Check for more than one variable.
                                        $v = str_replace("~", $matches[2][$i], $v); // Replace the ~ with the second variable value.
                                   }
                                   $selection = str_replace($matches[0][$i], $v, $selection); // Replace the match with the accumulated variable.
                                   $i++; // Add one to the variable to loop.
                              }
                         }
                    }
                    ### End Var. BBCode Sec. ##
                    $this->parsed = $selection; // Insert the accumulated parsed selection into the parsed variable as to keep selection original.
                    unset($selection); // Remove all value from private variable selection.
               }
          }
     }
     
      protected function selectCodes($security=0) { // Security defaults to 0. Set to 1 for non-variable bbcodes only.
      switch ($security) { // Switch between 0 and 1.
         default: // In the case of security being anything but one. Defaulting to zero.
         case 0: // In the case of security being zero.
            $this->bbcodes =
               array( "[i]" => "<i>", "[/i]" => "</i>",  "[b]" => "<b>", "[/b]" => "</b>", "[u]" => "<u>", "[/u]" => "</u>", "[s]" => "<del>", "[/s]" => "</del>", "[move]" => "<marquee>", "[/move]" => "</marquee>",
               "[center]" => "<center>", "[/center]" => "</center>", "[hr]" => "<hr />", "[table][tr][td]" => "<table>", "" => "</table>", "[table][tr][td]" => "<tr>", "[/td][/tr][/table]" => "</tr>", "[table][tr][td]" => "<td>",
               "[/td][/tr][/table]" => "</td>", "[sub]" => "<sub>", "[/sub]" => "</sub>", "[sup]" => "<sup>", "[/sup]" => "</sup>", "[tt]" => "<tt>", "[/tt]" => "</tt>", "[list]" => "<ul>", "[/list]" => "</ul>", "[list][li]" => "<li>",
               "[/li][/list]" => "</li>", "[/size]" => "</font>", "[/face]" => "</font>", "[/color]" => "</font>", "[p]" => "<p>", "[/p]" => "</p>",
               "[/td][/tr][/table][code]" => "<p style=\"background: #BBBBBB; border: 1px solid #555555; padding: 6px;\"><span style=\"font: bold 10px Courier New;\">&nbsp;&nbsp;&nbsp;CODE :</span><br/>",);
            // BBCode array including their replacement.
            $this->vbbcodes = 
               array( "/\[size=(.+)\]/Ui" => "<font size=\"*\">", "/\[face=(.+)\]/U" => "<font face=\"*\">", "/\[color=(.+)\]/Ui" => "<font color=\"*\">", "/\[img\](.+)\[\/img\]/Ui" => "<img src=\"*\" />",
               "/\[email\](.+)\[\/email\]/Ui" => "<a href=\"mailto:*\">*</a>", "/\[url\](.+)\[\/url\]/Ui" => "<a href=http://\*\>*</a>", "/\[email=(.+)\](.+)\[\/email\]/Ui" => "<a href=\"mailto:*\">~</a>",
               "/\[url=(.+)\](.+)\[\/url\]/Ui" => "<a href=\"*\">~</a>", "/\[quote](.+)\[\/quote\]/is" => "<div class=\"quote_header\">Quote:</div><div class=\"quote_body\">*</div>", "/\[quote=(.*)\](.*)\[\/quote\]/is" => "<div style=\"background: #e4ebeb; border: 1px solid #555555; padding: 6px;\">
<div style=\"font-size:10px; color:#043050;\">Quote by * :</div>
<div>~</div></div>
" );  
            // Variable BBCode array including their replacement and variable position(s).
            break;
         case 1: // In the case of security being one.
            $this->bbcodes =
               array( "[i]" => "<i>", "[/i]" => "</i>", "[b]" => "<b>", "[/b]" => "</b>", "[u]" => "<u>", "[/u]" => "</u>", "[s]" => "<del>", "[/s]" => "</del>", "[move]" => "<marquee>", "[/move]" => "</marquee>",
               "[center]" => "<center>", "[/center]" => "</center>", "[hr]" => "<hr />", "[table][tr][td]" => "<table>", "" => "</table>", "[table][tr][td]" => "<tr>", "[/td][/tr][/table]" => "</tr>", "[table][tr][td]" => "<td>",
               "[/td][/tr][/table]" => "</td>", "[sub]" => "<sub>", "[/sub]" => "</sub>", "[sup]" => "<sup>", "[/sup]" => "</sup>", "[tt]" => "<tt>", "[/tt]" => "</tt>", "[list]" => "<ul>", "[/list]" => "</ul>", "[list][li]" => "<li>",
               "[/li][/list]" => "</li>", "[/td][/tr][/table][code]" => "<p style=\"background: #BBBBBB; border: 1px solid #555555; padding: 6px;\"><span style=\"font: bold 10px Courier New;\">&nbsp;&nbsp;&nbsp;CODE :</span><br/>",
               "[/c.ode]" => "</p>" ,"[c.ode]" => "<p style=\"background: #BBBBBB; border: 1px solid #555555; padding: 6px;\"><span style=\"font: bold 10px Courier New;\">&nbsp;&nbsp;&nbsp;CODE :</span><br/>", "[/c.ode]" => "</p>");
            // BBCode array including their replacement.
            break; 
          }
     }
     function parseEmoticons($noBBCode=0) { // noBBCode variable defaults to 0. If set to one the parser will not parse be able to parse BBCode.
          if(!$this->selection) { // Check if the user has set the selection.
               $this->debug .= "You must set a value for the selection before parsing! "; // Set the Debug variable if not.
          }else{
               $error = 0; // Default to no errors.
               if($this->parsed) { // If something has already been parsed.
                    $selection = str_replace("\n", '', $this->parsed); // Set the parsed value in order to not reset the already parsed selection.
               }elseif($noBBCode==1) { // If nothing has been parsed and the noBBCode variable has been set to one.
                    $selection = str_replace("\n", '', $this->selection); // Set the selection value to variable selection.
                    $error = 2; // Set the error variable to 2 so that it will not look for [code] tags.
               }else{ // If all else fails.
                    $this->debug .= "You must parse BBCode first or set the noBBCode variable to 1(setting this variable will not allow bbcode to be parsed)! "; // Set the Debug variable if it gets here.
                    $error = 1; // Set the error variable so the parser doesn't run.
               }
               if($error==0 or $error==2) {
                    if($error==0) { // Only search if there has been parsing.
                         unset($matches);
                         preg_match_all('/\<p style="background: #BBBBBB; border: 1px solid #555555; padding: 6px;"\>.+\<\/p\>/Uim', $selection, $matches); // Finds all code selections.
                         $i = 0; // Set the variable to the default of 0.
                         while(isset($matches[0][$i])) { // Check for match from preg_match.
                              $selection = str_ireplace($matches[0][$i], "[code$i]", $selection); // Replace for non-emoticon section.
                              $i++; // Add one to the variable to loop.
                         }
                    }
                    foreach($this->emoticons as $key => $value) { // For each emoticon set the key and value.
                         $v = str_replace(" ", "", $value); // Remove all spaces from value but not replacing the value variable.
                         $v = "<img src=\"" . $this->path2emoticon . strtolower($v) . $this->imgext . "\" alt=\"$value\" />"; // Set the image replacement up.
                         $selection = str_ireplace($key, $v, $selection); // Replace the key with the set up image replacement.
                    }
                    if($error==0) { // Only search if there has been parsing.
                         while($i>0) { // Reloop through matches.
                              $i--; // Remove one from the variable to loop.
                              $selection = str_ireplace("[code$i]", $matches[0][$i], $selection); // Add the codes back for final display.
                         }
                    }
                    $this->parsed = $selection; // Insert the accumulated parsed selection into the parsed variable as to keep selection original.
                    unset($selection); // Remove all value from private variable selection.
               }
          }
     }
}
?>

Open in new window

0
Comment
Question by:runnerjp
  • 8
  • 5
13 Comments
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22968774
Your code seems to work fine here. How are you testing it? What makes you think it does not work?
0
 

Author Comment

by:runnerjp
ID: 22968800
well i do something liek the code below and it just outputs [ur]lwww.theurl.com[/url]

$message = '[url]www.theurl.com[/url]';
 
								$message = BBCode($message);
 
echo $message; ?>

Open in new window

0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22968900
You have not written an explicit constructor for the class so you either need to add

function BBCode( $optionalText = "" ) {
    if ( $optionalText != "" ) {
        $this->selection = $optionalText;
        $this->parseCode();
}

and use like so

$b = new BBCode( $message );
echo $b->parsed;

or a function

function convert( $optionalText = "" ) {
    if ( $optionalText != "" ) {
        $this->selection = $optionalText;
        $this->parseCode();
        return $this->parsed;
}

and use like so

$b = new BBCode();
echo $b->convert( $message );

or use it like this

$b = new BBCode();
$b->selection = "Here is code [url=http://example.com]my url[/url] and [quote=\"bportlock\"]This seems OK to me[/quote]";
$b->parseCode();

echo $b->parsed;
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22968909
PS - just noticed (after posting) that the code samples have a missing brace in the first two examples


function BBCode( $optionalText = "" ) {
    if ( $optionalText != "" ) {
        $this->selection = $optionalText;
        $this->parseCode();
}

should be


function BBCode( $optionalText = "" ) {
    if ( $optionalText != "" ) {
        $this->selection = $optionalText;
        $this->parseCode();
    }
}

and similarly in the second example.
0
 

Author Comment

by:runnerjp
ID: 22968939
ok i got it to work...

$b = new BBCode();
$b->selection = "Here is code [url=http://example.com]my url[/url] and [quote=\"bportlock\"]This seems OK to me[/quote]";
$b->parseCode();

echo $b->parsed;

but when i add it to my message page

<?php

                                                $message = $gettopic3['post'];

                                                $b = new BBCode();
$b->selection = $message;
$b->parseCode();

echo $b->parsed;?>

it shows the url but not the quote??
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22969046
What were you using for the quote? Exactly what text was fed in to the class via $message?
0
 

Author Comment

by:runnerjp
ID: 22969059
quote=\"bportlock\"]This seems OK to me[/quote]  is what i used as it worked on the seprate page with ccode u provided
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22969082
This...

quote=\"bportlock\"]This seems OK to me[/quote]

is missing a leading bracket. Try

[quote=\"bportlock\"]This seems OK to me[/quote]
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22969089
By the way, those "\" escaping the quotes were for PHP to work properly. Leave the slashes out if you are testing this by typing it into to a textarea or if you are delimiting your string with single quotes rather than double quotes.
0
 

Author Comment

by:runnerjp
ID: 22970085
ahhh great i have it working now :D seems your good at this lol can i ask is there anyway to make pther code tags work in the [quote] tags such as bold and italic and the links?
"/\[quote](.+)\[\/quote\]/is" => "<div class=\"quote_header\">Quote:</div><div class=\"quote_body\">*</div>", "/\[quote=(.*)\](.*)\[\/quote\]/is" => "<div style=\"background: #e4ebeb; border: 1px solid #555555; padding: 6px;\">
<div style=\"font-size:10px; color:#043050;\">Quote by * :</div>
<div>~</div></div>

Open in new window

0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 22970439
It already seems to work


$b = new BBCode();
$b->selection = '[quote="bportlock"]Lorem ipsum [b]dolor sit amet, consectetuer adipiscing[/b] elit, sed diam nonummy [url=http://www.experts-exchange.com]nibh euismod[/url] tincidunt [i]ut laoreet[/i] dolore magna aliquam erat[/quote]';
$b->parseCode();

echo $b->parsed;
0
 
LVL 34

Accepted Solution

by:
Beverley Portlock earned 2000 total points
ID: 22970442
I suspect that the EE editor might have messed that - I'll post it as a snippet

$b = new BBCode();
$b->selection = '[quote="bportlock"]Lorem ipsum [b]dolor sit amet, consectetuer adipiscing[/b] elit, sed diam nonummy [url=http://www.experts-exchange.com]nibh euismod[/url] tincidunt [i]ut laoreet[/i] dolore magna aliquam erat[/quote]';
$b->parseCode();
 
echo $b->parsed;

Open in new window

0
 

Author Closing Comment

by:runnerjp
ID: 31517154
thanks its working great now!

points fully deserved :D
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article discusses how to create an extensible mechanism for linked drop downs.
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to count occurrences of each item in an array.
Suggested Courses
Course of the Month14 days, 21 hours left to enroll

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question