Jump to content

Archived

This topic is now archived and is closed to further replies.

palcrypt

PHP HTML help

Recommended Posts

I'm editing the pn_bbcode module in postnuke, but I'm pretty new to PHP. I've got a small problem that's driving me nuts. I have a string variable set to contain a series of html tags. The first part of this is a table tag. For some reason when the function is called the "<" and ">" in the first tag in the string only is replaced with it's
[code]&lt;[/code] and [code]&gt;[/code] respectively. I can't figure out why this is.

Here's the entire function. I used another function in the script as a starting point, but it seems, to me anyway, that I edited everything properly.
[code]/**
* Paul Romer - May 19, 2006
* Perfroms [hide][/hide] bbencoding on the given string, and returns the results.
* code samples ussed from the pn_bbcode_encode_quote function by Nathing Codding
*/
function pn_bbcode_encode_hide($message)
{
    // If there aren't any "[hide=" or "[hide]" strings in the message, we don't need to process
    if (!strpos(strtolower($message), "[hide=") && !strpos(strtolower($message), "[hide]")) {
        return $message;
    }
    
    add_stylesheet_header();
    
    $stack = Array();
    $curr_pos = 1;
    while ($curr_pos && ($curr_pos < strlen($message))) {
        $curr_pos = strpos($message, "[", $curr_pos);

        // If not found, $curr_pos will be 0, and the loop will end.
        if ($curr_pos) {
            // We found a [. It starts at $curr_pos.
            // check if it's a starting or ending hide tag.
            $possible_start = substr($message, $curr_pos, 5);
            $possible_end_pos = strpos($message, "]", $curr_pos);
            $possible_end = substr($message, $curr_pos, $possible_end_pos - $curr_pos + 1);
            if (strcasecmp("[hide", $possible_start) == 0)
            {
                // We have a starting hide tag.
                // Push its position on to the stack, and then keep going to the right.
                array_push($stack, $curr_pos);
                ++$curr_pos;
            } else if (strcasecmp("[/hide]", $possible_end) == 0) {
                // We have an ending quote tag.
                // Check if we've already found a matching starting tag.
                if (sizeof($stack) > 0) {
                    // There exists a starting tag.
                    // We need to do 2 replacements now.
                    $start_index = array_pop($stack);

                    // everything before the [hide=xxx] tag.
                    $before_start_tag = substr($message, 0, $start_index);

                    // find the end of the start tag
                    $start_tag_end = strpos($message, "]", $start_index);
                    $start_tag_len = $start_tag_end - $start_index + 1;
                    if($start_tag_len > 6) {
                        $title = substr($message, $start_index + 6, $start_tag_len - 7);
                    } else {
                        $title = "";
                    }

                    // everything after the [hide=xxx] tag, but before the [/hide] tag.
                    $between_tags = substr($message, $start_index + $start_tag_len, $curr_pos - ($start_index + $start_tag_len));
                    // everything after the [/hide] tag.
                    $after_end_tag = substr($message, $curr_pos + 7);
                    $hidetext = '<table width=500 cellpadding=3 cellspacing=0 class="hidetable"><tr><td><div class="hideheader">' . $title . '</div><p><div class="hidetextvis">' . $between_tags . '</div></td></tr></table>';
                    $message = $before_start_tag . $hidetext . $after_end_tag;

                    // Now.. we've screwed up the indices by changing the length of the string.
                    // So, if there's anything in the stack, we want to resume searching just after it.
                    // otherwise, we go back to the start.
                    if (sizeof($stack) > 0) {
                        $curr_pos = array_pop($stack);
                        array_push($stack, $curr_pos);
                        ++$curr_pos;
                    } else {
                        $curr_pos = 1;
                    }
                } else {
                    // No matching start tag found. Increment pos, keep going.
                    ++$curr_pos;
                }
            } else {
                // No starting tag or ending tag.. Increment pos, keep looping.,
                ++$curr_pos;
            }
        }
    } // while

    return $message;
}[/code]

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.