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

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

             
Веб-курсы


Что это?

Оглавление

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

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

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

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

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

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



Реклама

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







Шаг 2

Длинное слово

Мы живем в несовершенном мире. И люди не всегда благочестивы и законопослушны. Особенно молодежь. Так и норовят что то испортить или поломать.
А если мы на сайт поставим такой скрипт, очень скоро найдется "умелец" и обязательно запостит оооочень длинное слово. В таком случае верстка расползется и появится горизонтальеый скролл. Можете сами посмотреть на тесте, который мы изготовили на прошлом занятии.

Так вот, чтобы обезопасить сайт от таких вандалов, нужно разорвать такие слова переносом строки. В PHP есть для этого специальная функция wordwrap()/ Однако у неё есть два недостатка, которые не позволяют использовать эту функцию в нашем скрипте. Первый - она режет не только длинные слова, но и предложения. А значит нарушает оригинальное форматирование. А второй еще серьёзнее - она не умеет работать с многобайтными кодировками. И по этому на местах разрывов слов будут появляться всякие непотребности. Чтобы сделать все красиво, придется нам написать свою функцию, аналог wordwrap(), но лишенную этих недостатков.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

/**   
* Функция - аналог wordwrap()  для кодировки UTF-8
* @param string $str  //обрабатываеемая строка
* @param int $width     //максимальная длина слова
* @param string $break //разделитель
* @return string  
*/ 
           
    
function mBwordwrap($text$width 90$break "\n")
    {
       return 
preg_replace('#([^\s]{'$width .'})#u''$1'$break $text);
    } 


Всё очень просто. Регулярное выражение составлено так, что после определенного количества символов, если в них не входит пробел, вставляет символ разрыва (по умолчанию перенос строки).

Ну вот, теперь можно дополнить наш скрипт этой функцией и попробовать в действии:
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php

/**   
* Основная функция интерпретатора
* @param string $text   //обрабатываемый текст
* @return string 
*/   
    
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 mBwordwrap($text100);                 
        
$text htmlspecialchars($text);
        
$text str_ireplace($bb$tag$text); 
        
$text str_replace('  ''&nbsp;&nbsp;'$text);    
        
$text nl2br($text);               
        return 
$text;            
    } 
    
 
/**   
* Функция - аналог wordwrap()  для кодировки UTF-8
* @param string $str  //обрабатываеемая строка
* @param int $width     //максимальная длина слова
* @param string $break //разделитель
* @return string  
*/ 
           
    
function mBwordwrap($text$width 74$break "\n")
    {
       return 
preg_replace('#([^\s]{'$width .'})#u''$1'$break $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>


Теперь поломать дизайн длинными словами не выйдет, как не старайся. Однако есть еще куча способов, как попортить нам кровь. Но и мы не лыком шиты, придумаем способы борьбы с этим нехорошим явлением - вандализм.

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