PHP.ee
 php.ee   linuxator.com   whee 
07.02.12 / 23:31
  Artiklid
  » Algajaile
  » Andmebaasid
  » Varia
  » Graafika
  » Advanced
Logi sisse:
< nimi
< pass
Unustasid passi?
Kas eelistad võimalusel PHP koodi objektorienteeritult kirjutada?
 Jah, see teeb töö lihtsamaks
 Jah, see on lihtsalt lahe
 Nii ja naa, ei tunne erilist võitu
 Ei, mõttetu ajakulu
 Ei oska objektorienteeritult progeda
Tulemused
Liitu listiga!
Telli PHP uudiskiri
Nimi:
Email
bb-kood - see on imelihtne
Kilukarp

Mis on bb-kood?
Paljudes paikades (foorumid näiteks) on ohtlik lubada kasutajatel vabalt html-i sisestada. Bb-kood on html-i aseaine, mille abil saab lisada kontrollitud kujul kujunduselemente. Lisavõimalusena lubab bb-kood kasutada tage, mida otseselt html-is ei ole. Näiteks:
code - koodi jaoks
php - php jaoks
See õpetuse abil saab tekitada omale lihtsa ja lühikese bb-koodi muutja.

Õpetus
Kõigepeal bb-koodi kirjeldus ehk mida üldse töödelda.
Esitatud lihtsa massiivi kujul tag -> vahetus string:
$tagid = array(
    'b' => '<b>%s</b>',
    'u' => '<u>%s</u>',
    'i' => '<i>%s</i>',
    'tsitaat' => '<blockquote><small><b>Tsitaat</b>:<hr>%s<hr></small></blockquote>',
    'url' => '<a href="%s">%s</a>',
    'mail' => '<a href="mailto:%s">%s</a>',
    'img' => '<img src="%s" alt="%s">',
    'code' => '<font color="green">%s</font>',
    'kood' => '<font color="green">%s</font>',
    'color' => '<font color="%s">%s</font>',
    'size' => '<font size="%s">%s</font>'
);

Vahetus string on tehtud sellisel kujul, mis sobib funktsioonile sprintf esimeseks parameetriks.

Järgmine rida liidab massiivi võtmed kokku, kasutades vahemärgiks loogilist "või"-d ehk "|". See rida on vajalik regulaaravaldise jaoks:
$atag = join( '|', array_keys( $tagid));

Nüüd tuleb teha paar abi-funktsioon.
Põhifunktsioon - otsib ette antud stringis olevaid bb-koode, ning nende leidmisel kutsub välja callback funktsioon. Selleks kasutab php funktsiooni
mixed preg_replace_callback ( mixed pattern, mixed callback, mixed subject);

function nk( $s){
    global $atag;
    $t = preg_replace_callback( '/\[('.$atag.')(=(.*))?\](.*)\[\/\1\]/isU', 'nc', $s);
    return $t;
}


Regulaaravaldis jaguneb järgnevalt:
\[ - otsitav string algab kandilise suluga
('.$atag.') - otsitakse kõiki elemente, millede vahel kasutatakse loogilist "või"-d. Ühtlasi on see loogiline element nr. 1
(=(.*)) - lisaks elemendile võib sisaldada võrdusmärki ja sellele järgnevat teksti. Loogilised elemendid 2 ja 3.
? - määrab ära, et eelmine tingimus (võrdusmärgi kohta) võib esineda 0 või rohkem korda
\] - esimene pool lõppeb kandilise suluga
(.*) - siin võib olla suhteliselt suvaline tekst. Loogiline element 4.
\[\/ - tagi lõpumärgid - kandilise sulu algus ja kaldkriips
\1 - lõpp peab olema sama, kui algus - ehk siis loogiline element nr. 1
\] - tagi lõpp.
i - ei hoolita tähtede suurusest.
s - ei hoolita rea vahetustest.
U - vähendatakse "ahnust". "Ahne" otsing kasutaks mitme sarnase tagi korral esimese esimest tagi ja viimase tagumist tagi.

nc on siis see callback funktsiooni nimi:
function nc( $s){
See rida läheb uuele ringile, sest üks kood võib sisaldada omakorda teist:
if ( $s[1] ) $s[4] = nk( $s[4]);
global $tagid;

Järgneval real on kogu koodi vahetamise raskus. Massiivi elemendid sõltuvad regulaaravaldises olnud sulgudest - iga sulu koht vastab ühele loogilisele elemendile ehk siis massiivi elemendile.
Massiivis kohal 0 on kogu vahetatav string.
return $s[1]?sprintf($tagid[$s[1]],(!empty($s[3])?$s[3]:$s[4]),$s[4]):$s[0];
}


See kutsub välja koodide muutmise:
echo nl2br( nk( htmlspecialchars( $text, ENT_NOQUOTES)));

PHP kood:


 
<?php
$tagid 
= array(
    
'b' => '<b>%s</b>',
    
'u' => '<u>%s</u>',
    
'i' => '<i>%s</i>',
    
'tsitaat' => '<blockquote><small><b>Tsitaat</b>:<hr>%s<hr></small></blockquote>',
    
'url' => '<a href="%s">%s</a>',
    
'mail' => '<a href="mailto:%s">%s</a>',
    
'img' => '<img src="%s" alt="%s">',
    
'code' => '<font color="green">%s</font>',
    
'kood' => '<font color="green">%s</font>',
    
'color' => '<font color="%s">%s</font>',
    
'size' => '<font size="%s">%s</font>'
);
$atag join'|'array_keys$tagid));
?>
<html>
<head><title>Kilutest</title></head>
<body>
<hr>
<?php if( !isset( $sub)) { ?>
<form method="post" action="<?php echo $PHP_SELF?>">
<textarea name="text" cols="100" rows="20"></textarea> 
<br><input type="submit" name="sub" value="Saada"> 
</form> 
Lubatud tagid:<hr> 
<?php
foreach( $tagid as $key => $value) 
echo "<b>$key</b><br>n"

}
 else 
function nc( $s){ 
if ( $s[1] ) $s[4] = nk( $s[4]); 
global $tagid
return $s[1]?sprintf($tagid[$s[1]],(!empty($s[3])?$s[3]:$s[4]),$s[4]):$s[0]; 

function nk( $s){ 
global $atag
$t = preg_replace_callback( '/[('.$atag.')(=(.*))?](.*)[/1]/isU', 'nc', $s); 
return $t

echo nl2br( nk( htmlspecialchars( $text, ENT_NOQUOTES))); 

?> 
<hr>Scripti suurus : <?=filesize( basename( $PHP_SELF))?> 
</body> 
</html> 


Artikli kommentaarid

O