Рейтинг@Mail.ru
 

Шаг 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>


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