Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Създаване на BBCode (Bulletin Board Code) интерпретатор чрез PHP
  1. BBCode тагове
     
Автор  plamenSm (12.04.2008 11:19)  съобщение до автора
Погледнат  3028 пъти  добави към любими
Оценка  добави коментар
Гласове  1  изпрати на приятел
Коментари  (3)  абонирай се за PHP
    Страница 1 / 1

 



Ако някога сте оставяли съобщения в Bulletin Board, вероятно ви е направило впечатление, че за форматиране на текста се използват подобни на HTML тагове. Ако не сте, вижте тук „myLinks / Нов myLink”. Повечето от тези бюлетини (като vBulletin например) работят чрез вграден BBCode интерпретатор.

В този урок ще научите как можете да направите свой собствен PHP интерпретатор за BBCode. Първо ще разгледаме някои от по-простите BBCode тагове (като [b], [i] и [u]), след това ще видим и възможностите за влагане на таговете един в друг.

Простите BBCode тагове [b], [i] и [u] наистина се обработват просто и не са необходими някакво по-специални познания. Достатъчно е да сте на ясно с функцията preg_replace() и регулярните изрази. Нека да започнем да създаваме функция за преформатиране на BBCode в HTML стъпка по стъпка:

CODE
1
2
3
4
5
6
<?php
function bbcode_format ($str) {
      
       
return $str;
}
?>

Естествено така написана функцията не прави нищо. Първото нещо, което трябва да направим е да добавим функцията htmlentities() за да предотвратим евентуални неочаквани HTML или XSS „инжекции”. Добавяме като първи ред във фуннкцията:

CODE
1
2
3
<?php
$str = htmlentities($str);
?>

Сега да напишем и код който преформатира простите BBCode тагове. Ако вече сте погледнали документацията или сте на ясно с функцията preg_replace(), знаете, че тя има 3 задължителни параметъра: шаблон за търсене (pattern), начина на замяна (replacement) и в какво да се търси (subject). В нашия пример чрез pattern ще описваме BBCode таговете, чрез replacement ще задаваме HTML тагове, които заменят BBCode таговете и чрез subject - входния стринг.

Обикновено трудната част при „preg_.....()” - функциите в PHP е създаването на точен регулярен израз, но в случая с простите BBCode тагове това не е чак толкова сложно. Например за таг [b] израза е:

CODE
1
\[b\](.*?)\[\/b\]/is

Тук частта (.*?) означава „всико между [b] и [/b]” тоест това е текста, който трябва да стане удебелен (bold). В края на израза има 2 символа „is”, това са така наречените модификатори (modifiers). Те са допълнителни опции. Модификатора ‘i’ указва, че не трябва са се прави разлика между малки и големи букви. Тоест ‘b’ и ‘B’ следва да се приемат за едно и също нещо. Модификатора ‘s’ указва, че преминаването на нов ред в subject не трябва да спира търсенето. Ако липсва този модификатор, няма да можем да обработваме текстове написани на няколко реда (повече за модификаторите).

Параметъра „replacement” също е елементарен. Просто трябва да напишем HTML код, като вмъкнем отговарящия на (.*?) текст където е необходимо. За целта се използва автоматично създадената променлива $1:

CODE
1
<strong>$1</strong>

Продължаваме да разширяваме нашата функция:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function bbcode_format ($str) {

       
$str = htmlentities($str);

       
// Прости BBCode тагове
       
$str = preg_replace ('/\[b\](.*?)\[\/b\]/is', '<strong>$1</strong>', $str);
       
$str = preg_replace ('/\[i\](.*?)\[\/i\]/is', '<em>$1</em>', $str);
       
$str = preg_replace ('/\[u\](.*?)\[\/u\]/is', '<u>$1</u>', $str);

       
return $str;
}
?>

Това е достатъчно за преработване на трите прости тага - [b], [i] и [u]. Но можем да помислим как да направим функцията по-опростена и евентуално по-бърза. Можем да сведем извикването на preg_replace() до еднократно, тъй като тя приема като параметри и масиви. С тази промяна нашата функция ще изглежда така:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function bbcode_format ($str) {
       
$str = htmlentities($str);

       
$simple_search = array(
                               
'/\[b\](.*?)\[\/b\]/is',                              
                               
'/\[i\](.*?)\[\/i\]/is',                              
                               
'/\[u\](.*?)\[\/u\]/is'
                               
);

       
$simple_replace = array(
                               
'<strong>$1</strong>',
                               
'<em>$1</em>',
                               
'<u>$1</u>'
                               
);

       
// Прости BBCode тагове
       
$str = preg_replace ($simple_search, $simple_replace, $str);

       
return $str;
}
?>

Възможно е да имате BBCodes с няколко параметъра, като например:

CODE
1
[url=http://it-place.net/]it-place.net[/url]

Регулярния израз в случаяще бъде:

CODE
1
/\[url\=(.*?)\](.*?)\[\/url\]/is

и малко по-различен начин на замяна - имаме вече 2 автоматични променливи:

CODE
1
<a href="$1">$2</a>

Както виждате не е сложно. Можете правите преработка на всякакви BBCode тагове.


Влагане на тагове

Влагането на простите тагове, които разгледахме до тук не е проблем и ще работи нормално. Например

CODE
1
[b][i][u]text text text[/u][/i][/b]

е напълно допустим израз. Влагането на еднакви тагове е безсмислено и няма да има никакъв ефект. Например:

CODE
1
[b][b]text text text[/b][/b]

Има обаче случаи в които се налага влагане на еднотипни тагове. Такъв е случая с таг [quote], който се използва обикновено за показване на цитати. Възможно и нормално е да има вложени [quote]. В този случай регулярните изрази не могат да ни помогнат. Ще трябва да напишем специален PHP код за целта. Това което трябва да направим е да заменим [quote] и [/quote] съответно с подходящ HTML код. Трябва и да се уверим, че броя на отварящите тагове съответства на броя на затварящите, иначе подредбата на следващия текст ще се наруши.


Функцията, която прави това изглежда така:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
function bbcode_quote ($str) {

       
$open = '<blockquote>';
       
$close = '</blockquote>';

       
// Колко са отварящите тагове?
       
preg_match_all ('/\[quote\]/i', $str, $matches);
       
$opentags = count($matches['0']);

       
// Колко са затварящите?
       
preg_match_all ('/\[\/quote\]/i', $str, $matches);
       
$closetags = count($matches['0']);

       
// Ако има незатворени тагове ги затваряме в края
       
$unclosed = $opentags - $closetags;
       
for ($i = 0; $i < $unclosed; $i++) {
               
$str .= '</blockquote>';
       
}

       
// Правим проста замяна
       
$str = str_replace ('[quote]', $open, $str);
       
$str = str_replace ('[/quote]', $close, $str);

       
return $str;
}
?>


Както се вижда от кода, функцията първо коригира входния стринг, ако има незатворени тагове, след което прави проста замяна. Тази функция може да се доработи така, че да обработва и други тагове, които допускат влагане.


Заключение

В този урок видяхте колко просто може да се направи интерпретатор на BBCode. Вие можете да разширите примерния код с най-различни тагове като [image], [video], [sound] и др.



Източник:

http://www.phpit.net/article/create-bbcode-php/1/
http://www.phpit.net/article/create-bbcode-php/2/



   


Ключови думи: PHP bbcode html XSS таг BBCode тагове интерпретатор регулярен израз


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 2 посетители четат този урок (0 потребители и 2 гости)  
Активни потребители: ---
   
  

Еmail  
 


 
string htmlentities( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

  plamenSm на 19.04.2008 13:59

Има проблем с при употребата с кирилица.
Проблема идва от функцията:
CODE
1
htmlentities();

И в место тази функция трябва да се използва:
CODE
1
htmlspecialchars();

С htmlspecialchars() може да се използва и utf8.

За да поправите грешката промете реда
CODE
1
        $str = htmlentities($str);
по следния начин
CODE
1
        $str = htmlspecialchars($str);

  mlg на 19.04.2008 12:00

Всъщност в Цитатите си пропуснал 1 нещо! Има  цитати които имат допълнителни неща! Като например username- от който цитираш и дата също!
Поздрави!

  zipopro на 13.04.2008 09:46

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008