AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.
Direct software marketing conglomerate





Шаг 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-тегами. Они будут обработаны. И кажется, что все в порядке, однако сложности только начинаются.

Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009