Рейтинг@Mail.ru
 

Шаг 1

Форматирование

Мы уже встречались с таким явлением, как BB-теги. Это название кстати происходит вовсе не из-за тегов [b][/b], как многие думают. На самом деле это аббривеатура английского Bulletin Board , что переводится, как "доска объявлений". Именно для таких сайтов и была придумана эта псевдо-разметка.

Для чего она нужна. Дело в том, что хочется дать пользователю некоторые инструменты для форматирования текста, чтобы он был повыразительнее. Но дать доступ к HTML нельзя, ибо сразу же найдутся умельцы и напихают в него скриптов. Да и простому юзеру очень сложно понять, что такое теги и с чем их надо кушать.

А вот такая разметка убивает сразу трех зайцев. Упрощает интерфейс, перекрывает доступ к HTML и дает возможность хранить в базе текст без разметки, что повышает безопасность.

Но у такого вида форматирования есть куча недостатков. Давайте разберем их по порядку и попытаемся исправить.
И так, рассмотрим внимательно ту функцию, которую мы применяли в гостевой книге. Она довольно слабенькая и совсем небезопасная.
Нам же нужно что то типа этого. Так что начнем потихоньку её приводить в порядок.
Приступим.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

/**     
* bb-tags and smilies replacement function     
* Функция замены bb-тегов и смайликов  
* @param string  
* @return string    
*/ 
    
function bb_tags($text
    {   
       
// Создаем массив bb-тегов 
        
$bb = array(
                    
'[B]'
                    
'[/B]'
                    
'[I]'
                    
'[/I]'
                    
'[S]'
                    
'[/S]'
                    
'[U]'
                    
'[/U]'
                    
'[:)]'
                    
'[:(]'
                    
'[;)]'
                    
'[:D]' 
                   
);  
       
// Создаем массив тегов HTML 
        
$tag = array(
                     
'<b>'
                     
'</b>'
                     
'<i>'
                     
'</i>'
                     
'<s>'
                     
'</s>'
                     
'<u>'
                     
'</u>',  
                     
'<img src="smiles/1.gif" />'
                     
'<img src="smiles/2.gif" />',  
                     
'<img src="smiles/3.gif" />'
                     
'<img src="smiles/4.gif" />' 
                
); 
        
// Заменяем элемент первого на элемент второго массива соответственно                 
        
return str_ireplace($bb$tag$text);             
    } 


Если Вы делали гостевую книгу и использовали эту функцию, то могли заметить, что она не сохраняет оригинальное форматирование.
Нельзя сделать          много         пробелов       подряд, не получаются отступы и абзацы. Все это происходит из-за того, что HTML отображает на странице только один пробел. Если нужно несколько подряд, то требуется так называемый "неразрушаемый пробел", который обозначается вот таким набором символов. &nbsp; А значит нам нужно заменить два идущих пробела на две этих комбинации. Тогда сохранится форматирование. Однако есть еще символ табуляции. Он тоже не отображается браузером. По этому заменим и его. За одно удалим символ возврата каретки (он только мешает)
1
2
3
4
5
6
7
<?php

        $text 
str_replace("\r"""$text);
        
$text str_replace("\t""    "$text); 
        
$text str_replace('  ''&nbsp;&nbsp;'$text);


С одной задачей справились. Ну а раз взялись за форматирование, то сделаем все преобразования сразу в функции. Заменим спецсимволы на эквиваленты и перенос строки на тег <br />. А чтобы следить за метаморфозами, присовокупим небольшенькую форму:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php

    
function createBBtags($text
    {   
       
// Создаем массив bb-тегов 
        
$bb = array(
                    
'[B]'
                    
'[/B]'
                    
'[I]'
                    
'[/I]'
                    
'[S]'
                    
'[/S]'
                    
'[U]'
                    
'[/U]'
                    
'[:)]'
                    
'[:(]'
                    
'[;)]'
                    
'[:D]' 
                   
);  
       
// Создаем массив тегов HTML 
        
$tag = array(
                     
'<b>'
                     
'</b>'
                     
'<i>'
                     
'</i>'
                     
'<s>'
                     
'</s>'
                     
'<u>'
                     
'</u>',  
                     
'<img src="smiles/1.gif" />'
                     
'<img src="smiles/2.gif" />',  
                     
'<img src="smiles/3.gif" />'
                     
'<img src="smiles/4.gif" />' 
                
); 
        
// Заменяем элемент первого на элемент второго массива соответственно 


        
$text str_replace("\r"""$text);
        
$text str_replace("\t""    "$text);        
        
$text htmlspecialchars($text);
        
$text str_ireplace($bb$tag$text); 
        
$text str_replace('  ''&nbsp;&nbsp;'$text);    
        
$text nl2br($text);               
        return 
$text;            
    } 
////////////////////////////////////////////////////////////////////////////////
////////    
    
if(!empty($_POST['ok']))    
    {     
        
$text = !empty($_POST['text']) ? $_POST['text'] : null;         
        echo 
createBBtags($text);
    }
    
    
?>
<form action="" name="post" id="post" method="post">        
<textarea name="text" id="text" cols="40" rows="10"><?php echo htmlspecialchars($text);?></textarea><br />    
<input name="ok" type="submit" />    
</form>  


вот теперь можно попробовать обработать текст. Оригинальное форматирование сохранится. Можно даже попробовать запостить текст с bb-тегами. Они будут обработаны. И кажется, что все в порядке, однако сложности только начинаются.