TCH (statz) | #1, Főfasz (10466) |
8314 | #0fd8 | ^ | Idézet | Sun, 23 May 2010 15:56:52 +02 |
188.36.*.* | *.dsl.pool.telekom.hu |
Na, akkor egy kis BBCode tanfolyam. BBCode-ból 4 féle van. 0. [tag]tartalom[/tag] 1. [tag=paraméter]tartalom[/tag] 2. [tag] (önzáró) 3. [tag paramnév0=paramérték0 paramnév1=paramérték0 ...]tartalom[/tag] A 0. feldolgozása a köv képpen néz ki: function bb_0($text, $tag, $r0, $r1, $r2 = '') { $beg = '[' . $tag . ']'; $lbeg = strlen($beg); $end = '[/' . $tag . ']'; $lend = strlen($end); while (($begpos = stripos($text, $beg, 0)) !== false) { if (($endpos = stripos($text, $end, $begpos)) !== false) { $midpos = $begpos + $lbeg; $pre = substr($text, 0, $begpos); $mid = substr($text, $midpos, $endpos - $midpos); $pst = substr($text, $endpos + $lend); $text = $pre . $r0 . $mid . $r1; if ($r2 != '') { $text .= $mid . $r2; } $text .= $pst; } else { return $text; } } return $text; }Lényegében csak megkeresi a "[tag]" részt, keres utána egy "[/tag]" részt és ha talál, akkor cseréli őket a megadott részre. Az 1. feldolgozása: function bb_1($text, $tag, $r0, $r1, $r2) { $beg = '[' . $tag . '='; $lbeg = strlen($beg); $end = '[/' . $tag . ']'; $lend = strlen($end); while (($begpos = strpos($text, $beg, 0)) !== false) { if (($clspos = stripos($text, ']', $begpos)) !== false) { if (($endpos = stripos($text, $end, $clspos)) !== false) { $parpos = $begpos + $lbeg; $midpos = $clspos + 1; $pre = substr($text, 0, $begpos); $par = substr($text, $parpos, $clspos - $parpos); $mid = substr($text, $midpos, $endpos - $midpos); $pst = substr($text, $endpos + $lend); $text = $pre . $r0 . $par . $r1 . $mid . $r2 . $pst; } else { return $text; } } else { return $text; } } return $text; }Ugyanaz mint az előbb, csak itt "[tag=" részt keres először, aztán a záró "]" részt, majd a végén a "[/tag]" részt. A 2. a legegyszerűbb: function bb_2($text, $tag, $r0) { return str_replace('[' . $tag . ']', $r0, $text); }Nem hiszem, hogy bármilyen magyarázat szükséges lenne. A 3. a legbonyolultabb: function bb_3($text, $tag, $r0, $r1, $r2, $params = array()) { $beg = '[' . $tag . ' '; $lbeg = strlen($beg); $end = '[/' . $tag . ']'; $lend = strlen($end); while (($begpos = strpos($text, $beg, 0)) !== false) { if (($clspos = stripos($text, ']', $begpos)) !== false) { if (($endpos = stripos($text, $end, $clspos)) !== false) { $parpos = $begpos + $lbeg; $midpos = $clspos + 1; $pre = substr($text, 0, $begpos); $par = substr($text, $parpos, $clspos - $parpos); $mid = substr($text, $midpos, $endpos - $midpos); $pst = substr($text, $endpos + $lend); $pars = explode(' ', $par); $par = ''; for ($i = 0; $i < count($pars); $i++) { $current = explode('=', $pars[$i]); if ($params[$current[0]] != '') { $par .= ' ' . $params[$current[0]] . '="' . $current[1] . '"'; } } $text = $pre . $r0 . $par . $r1 . $mid . $r2 . $pst; } else { return $text; } } else { return $text; } } return $text; }Lényege, hogy a $params paraméterben adhatod meg neki, hogy melyik belső paramétert mire cserélje. A keresés úgy megy, hogy "[tag " (space is benne van!) részt keres először, majd megkeresi a "]" részt. Utána a kettő közöttit feldarabolja spacek szerint, majd a darabokat "=" jel szerint. Első a param neve, a második a param értéke. Amennyiben a a param neve szerepel a $param tömbben, akkor kicseréli arra, ami meg van adva benne, majd hozzáfűzi az értéket is. Aztán megkeresi a szokásos "[/tag]" zárást és csumi. Ennyi az egész. Hozzáteszem, a szmájlik NEM BBCode tagek. Ha nem akarsz szarakodni ezeknek a felparaméterezésével, akkor itt van egy feldolgozó függvény, ami támogat alapból egy csomó szart: function bbcode2html($text) { $tags = array ( array('s', 0, '<s>', '</s>'), array('u', 0, '<u>', '</u>'), array('b', 0, '<b>', '</b>'), array('i', 0, '<i>', '</i>'), array('del', 0, '<s>', '</s>'), array('strike', 0, '<s>', '</s>'), array('code', 0, '<pre>', '</pre>'), array('cite', 0, '<cite>', '</cite>'), array('quote', 0, '<blockquote><div>', '</div></blockquote>'), array('embed', 0, '<embed src="', '" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385" />'), array('list', 0, '<ul>', '</ul>'), array('olist', 0, '<ol>', '</ol>'), array('olistua', 0, '<ol style="list-style-type: upper-alpha">', '</ol>'), array('olistla', 0, '<ol style="list-style-type: lower-alpha">', '</ol>'), array('olistur', 0, '<ol style="list-style-type: upper-roman">', '</ol>'), array('olistlr', 0, '<ol style="list-style-type: lower-roman">', '</ol>'), array('li', 0, '<li>', '</li>'), array('img', 0, '<img src="', '" />'), array('url', 0, '<a href="', '" target="_blank">', '</a>'), array('url', 1, '<a href="', '" target="_blank">', '</a>'), array('size', 1, '<font size="', '">', '</font>'), array('face', 1, '<font face="', '">', '</font>'), array('color', 1, '<font color="#', '">', '</font>'), array('hr', 2, '<hr />'), array('table', 3, '<table', '>', '</table>', array("cellpadding" => 'cellpadding', "cellspacing" => 'cellspacing', "class" => 'class', "align" => 'align', "bgcolor" => 'bgcolor', "width" => 'width')), array('tr', 3, '<tr', '>', '</tr>', array("class" => 'class', "align" => 'align', "bgcolor" => 'bgcolor', "valign" => 'valign')), array('th', 3, '<th', '>', '</th>', array("class" => 'class', "align" => 'align', "bgcolor" => 'bgcolor', "width" => 'width', "height" => 'height', "nowrap" => 'nowrap', "rowspan" => 'rowspan')), array('td', 3, '<td', '>', '</td>', array("class" => 'class', "align" => 'align', "bgcolor" => 'bgcolor', "width" => 'width', "height" => 'height', "nowrap" => 'nowrap', "rowspan" => 'rowspan')), ); for ($i = 0; $i < count($tags); $i++) { $data = $tags[$i]; $type = ($data[1] & 0x03); switch($type) { case 0: $text = bb_0($text, $data[0], $data[2], $data[3], $data[4]); break; case 1: $text = bb_1($text, $data[0], $data[2], $data[3], $data[4]); break; case 2: $text = bb_2($text, $data[0], $data[2]); break; case 3: $text = bb_3($text, $data[0], $data[2], $data[3], $data[4], $data[5]); break; } } return $text; } Jó szopást szórakozást! :) |