Блог


Функции для работы со строками.

Расширяем PHP.  Пока все сумбурно, потом систематизирую

Часто даже на серьезных сайтах можно встретить такое:

Цена 158 рубля/рублей

Некрасиво. А ведь совершенно несложно автоматизировать процесс и заставить говорить компьютер "человеческим" языком. 1 рубль, 2 рубля, 5 рублей. Всего то три формы, нужно только выбрать нужную. Вот функция, которая поможет это сделать с любыми словами:

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
<?php


    $num1 
rand(110);
    
$num2 rand(110000);
    
    echo 
$num1 
       . setEendings($num1' вещь стоит '' вещи стоят '' вещей стоят ')
       .
$num2 
       . setEendings($num2' рубль'' рубля'' рублей');

///////////////////////////////////////
//  Функция

    
function setEendings($cnt$word1$word2$word3)  
    { 
        
$cnt abs($cnt) % 100
        
$n   $cnt 10
     
        if(
$cnt 10 && $cnt 20)  
            return 
$word3;
      
        if(
$n && $n 5)  
            return 
$word2
     
        if(
$n == 1)  
            return 
$word1
     
        return 
$word3
    } 
    

 

Еще зачастую требуется сгенерировать случайную строку, для пароля допустим. Или для каптчи. В любом уважающем себя фреймворке такой функционал есть, но что делать тем, кто не юзает фреймворков? А вот для них следующая функция. Наверное несложно догадаться из описания констант, какой результат будет выдавать функция в зависимости от того, какую из них передать аргументами. Можно по одной, можно несколько в любом порядке. По умолчанию функция использует весь набор символов. И маленькие и большие и цифры. Но помните, для генерации рандомного числа эта функция не годится. Ибо она никогда не выдаст 0 или 1, а так же буквы l и O, так как их можно спутать.

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



// Буквы в верхнем регистре
    
define('IRB_STRING_LOWER'1);
// Буквы в верхнем регистре
    
define('IRB_STRING_UPER',  2);
// Цифры
    
define('IRB_NUMBER',       4); 
    
// Первый аргумент - длина строки 
// По умолчанию - длина 10, весь набор. 
    
echo 'Весь набор <br>';    
    echo 
randomString();
    
// Первый аргумент - длина строки
// Вторым аргументом комбинация констант
    
echo '<br><br> Нижний регистр <br>';
    echo 
randomString(20IRB_STRING_LOWER);
    
    echo 
'<br><br>Верхний регистр <br>';
    echo 
randomString(20IRB_STRING_UPER);
    
    echo 
'<br><br>Цифры <br>';
    echo 
randomString(20IRB_NUMBER);
    
    echo 
'<br><br>Верхний и нижний <br>';
    echo 
randomString(20IRB_STRING_UPER IRB_STRING_LOWER);
    
    echo 
'<br><br>Нижний и цифры <br>';
    echo 
randomString(20IRB_STRING_LOWER IRB_NUMBER);
    
    echo 
'<br><br>Верхний и  цифры <br>';
    echo 
randomString(20IRB_STRING_UPER IRB_NUMBER); 
    
///////////////////////////////////////////////
// Функция

    
function randomString() 
    {
        
$symbols[1] = 'abcdefghijkmnopqrstuvwxyz';
        
$symbols[2] = 'ABCDEFGHJKLMNPQRSTUVWXYZ';
        
$symbols[3] = $symbols[1] . $symbols[2];
        
$symbols[4] = '23456789';
        
$symbols[5] = $symbols[1] . $symbols[4];
        
$symbols[6] = $symbols[2] . $symbols[4];
        
        
$args   func_get_args();
        
$length = !empty($args[0]) ? $args[0] : 10;
        unset(
$args[0]); 
        
        
$string = empty($args) ? implode(''$symbols) : $symbols[$args[1]];
        
$string str_pad('', (25 $length), $string);
        
$string str_shuffle($string);

        return  
substr($string0$length);
    }
    
    

 

Функция транслитерации. Посмотрите сейчас в адресную строку. Видите там название страницы транслитом? Это результат работы следующей функции. Она позволяет переводить кириллицу в латиницу и наоборот. Красота этой функции в том, что она одна из немногих, делает это по ГОСТу. Кроме того, она может подготовить текст для URL или для названия файла. Она опционально очищает текст от всего, что не буквы, и заменяет пробельные символы дефисом.

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
<?php

    
// Очистка от лишних символов,
// заменяет пробельные символы на дефисы
// мы уже пользовались такой константой.
    
define('IRB_CLEAR',  1);
// Перевод с латиницы в кириллицу
    
define('IRB_STRING_RU',  2); 
    
//////////////////////////////////////////////////   
    
$string 'съешь еще этих мягких французских
               булок да выпей чаю?!:@#№'

    echo 
translateWord($stringIRB_CLEAR);
    
/////////////////////////////////////////////////
// Функция

    
function translateWord()
    {
        
$args func_get_args();
        
$text $args[0];
        unset(
$args[0]);
        
        if(
array_search(1$args) !== false)
        {
            
$text preg_replace('#[\s\r\n\t]+#uis'' '$text);            
            
$text preg_replace('#[^0-9a-zа-яё\s_-]#ui'''$text);
        }
        
$ru = array( 
                        
'А''Б''В''Г''Д''Е''Ё',  
                        
'Ж''З''И''Й''К''Л''М'
                        
'Н''О''П''Р''С''Т''У',  
                        
'Ф''Х''Ц''Ч''Ш''Щ''Ы'
                        
'Ъ''Ь''Э''Ю''Я'
                        
'а''б''в''г''д''е''ё',  
                        
'ж''з''и''й''к''л''м'
                        
'н''о''п''р''с''т''у',  
                        
'ф''х''ц''ч''ш''щ''ы'
                        
'ъ''ь''э''ю''я'' ' 
                    
); 
     
        
$en = array( 
                        
"A",  "B",  "V",  "G",  "D",  "E",   "E",  
                        
"ZH""Z",  "I",  "J",  "K",  "L",   "M",  
                        
"N",  "O",  "P",  "R",  "S",  "T",   "U",  
                        
"F" "X" "CZ""CH""SH""SHH""Y",  
                        
"''", "'",  "E",  "YU""YA"
                        
"a",  "b",  "v",  "g",  "d",  "e",   "e",  
                        
"zh""z",  "i",  "j",  "k",  "l",   "m",  
                        
"n",  "o",  "p",  "r",  "s",  "t",   "u",  
                        
"f" "x" "cz""ch""sh""shh""y",  
                        
"",    "",  "e""yu""ya""-" 
                    
);
        if(
array_search(2$args) !== false
        { 
            
$translated str_replace($en$ru$text);
            
$translated preg_replace('/(?<=[а-яё])Ь/u''ь'$translated); 
            
$translated preg_replace('/(?<=[а-яё])Ъ/u''ъ'$translated);
        } 
        else
            
$translated str_replace($ru$en$text);          
     
        return 
$translated;  
    }  

 

 Следующая функция расширяет штатную strip_tags().  Дело в том, что штатная функция удаляет теги из текста. Именно удаляет, а не очищает его. А чаще нужно как раз очистить. В чем принципиальная разница? А в том, что если в тексте есть скрипт или стиль к примеру, то теги удалятся, a сам текст скрипта останется. А он никому не нужен. И второе, если форматирование текста сделано с помощью CSS, совсем не факт, что между тегами есть пробелы. И текст получается слитным. Ну и еще пара моментов с переводом эквивалентов в символы. Вот пример:

1
 2
 3
 4
 5
 6
 7
 8
 9
<?php

    
echo $string '<style>.class{color:red}</style>'
                 
'<div class="class">съешь еще этих мягких</div>'
                 
'французских булок да выпей чаю';
                
    echo 
'<br><br>';
    echo 
strip_tags($string);

Наша функция эти недостатки учитывает и исправляет. Вот она:

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
 32
 32
 33
 34
 35
 36
 37
<?php


    
echo $string '<style>.class{color:red}</style>'
                 
'<div class="class">съешь еще этих мягких</div>'
                 
'французских булок да выпей чаю ';
                
    echo 
'<br><br>';
    echo 
clearTextHtml($string);
    
/////////////////////////////////////////////////
// Функция

    
function clearTextHtml($text)
    {
       
$tags = array (  '~<script[^>]*?>.*?</script>~si' => '',
                        
'~<style[^>]*?>.*?</style>~si'   => '',
                        
'~<br.*?>~i'                     => ' ',
                        
'~<hr.*?>~i'                     => ' '
                        
'~</p>~i'                        => ' ',
                        
'~</h[1|2|3|4|5|6]>~i'           => ' ',
                        
'~</t[r|h|d]>~i'                 => ' ',
                        
'~</div>~i'                      => ' ',
                        
'~</li>~i'                       => ' ',
                        
'~&(nbsp|#160);~i'               => ' ',
                        
'~&(quot|#34);~i'                => '"'
                        
'~&(amp|#38);~i'                 => '&',
                        
'~&(copy|#169);~i'               => '©'
                        
);
     
        return 
strip_tags(
                           
preg_replace(
                                        
array_keys($tags),
                                        
array_values($tags)
                         , 
$text));
    }  

 

Продолжение следует.

 

 

nbsp;

Теги: PHP

Комментарии (3)

kdes70
27-03-2013
Спасибо очень полезно!!!
Alex
02-04-2013
Вопрос. Почему в функции транслита - один массив в один. кавычках, а второй в двойных? Это опечатки или есть смысл?
twin
02-04-2013
Смысл есть во всем

Просто во втором массиве есть апострофы. Не хотелось экранировать, это неоднозначность. На ' меняем или на \'
А первый массив по привычке.

 
Наверх