Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

Фильтрация текста в PHP. Regex

Дата: Май 22, 2009

(0) комментариев

В данной статье я хочу показать, как с помощью функций preg_replace и ereg_replace можно манипулировать содержимым текста. Составление регулярных выражений для фильтрации текста очень часто вызывает проблеммы не только у новичков но и у людей достаточно долго работающих в программировании.
Но сначала немного о том что такое вообще эти Regex выражения.
Regular Expression (сокр. regex) или Регулярные выражения — это система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (англ. pattern), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской». Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. Они являются развитием символов-джокеров (англ. wildcard characters).

Синтаксис можно посмотреть тут http://ru.wikipedia.org/wiki/Regex , я же хочу остановиться на практическом применении. Вот небольшой список паттернов для preg_replace

1
2
3
4
5
6
7
8
9
$pattern = array(
//выражение для замены спец символов ; # &
'/(;)/ie', '/(#)/ie', '/(&)/ie',
//защита mysql от иньекции
'/(ACTION)/ie', '/(ADD)/ie', '/(ALL)/ie', '/(ALTER)/ie', '/(ANALYZE)/ie', '/(AND)/ie', '/(AS)/ie', '/(ASC)/ie',
//замена спец символов < > . , ? ` ! @ $ % ^ * ( ) _ - + = / \ ' " :
'/(<)/ie', '/(>)/ie', '/(\.)/ie', '/(,)/ie', '/(\?)/ie', '/(`)/ie', '/(!)/ie', '/(@)/ie',
'/(\$)/ie', '/(%)/ie', '/(\^)/ie', '/(\*)/ie', '/(\()/ie', '/(\))/ie', '/(_)/ie', '/(-)/ie',
'/(\+)/ie', '/(=)/ie', '/(\/

Я привёл полный список замен, вы можете выбрать только те, которые вас интересуют.
Для удаления этих символов из кода необходимо выполнить следующий код:

1
$text = preg_replace($pattern, "", $text);

Для замены на чтото своё поставте вместо «» свой текст или массив
Но описаный код конечно подойдёт не всем. Вам хочется написать не только для спец символов но и для некоторых фраз. Напримерe у вас есть дата в формате: May 22, 2009, из которой вы хотите удалить день. Для этого можно воспользоваться следующим кодом:

1
2
3
4
5
6
<?php
$string = "May 22, 2009";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
echo preg_replace($pattern, $replacement, $string);
?>

Если вам надо удалить из текста ‘this is my text’ слово text то віражение для замены будет выглядеть так
$string = «this is my text»;
echo preg_replace(«/text/», », $string);
?>

Как ещё можно применить эти regex?

Очень часто необходимо отфильтровать на пример текст сообщений на форуме, убрать возможный яваскрипт и другой вредоносный контент. Для этого воспользуемся таким кодом

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
<?php
// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.

$search = array ("'<script[^>]*?>.*?</script>'si",  // Вырезает javaScript
                 "'<[\/\!]*?[^<>]*?>'si",           // Вырезает HTML-теги
                 "'([\r\n])[\s]+'",                 // Вырезает пробельные символы
                 "'&(quot|#34);'i",                 // Заменяет HTML-сущности
                 "'&(amp|#38);'i",
                 "'&(lt|#60);'i",
                 "'&(gt|#62);'i",
                 "'&(nbsp|#160);'i",
                 "'&(iexcl|#161);'i",
                 "'&(cent|#162);'i",
                 "'&(pound|#163);'i",
                 "'&(copy|#169);'i",
                 "'&#(\d+);'e");                    // интерпретировать как php-код

$replace = array ("",
                  "",
                  "\\1",
                  "\"",
                  "&",
                  "<",
                  ">",
     

Ещё можно сделать следующую вещь. предположим человек оставил на форуме или блоге в своём сообщении сылку типа http://codeismy.name но не обернул её в тэг . Глупый поступок, но мы вё исправим :)
Для того, чтоб обернуть тэг выполним следующую обработку:

1
2
3
4
5
6
7
8
9
10
11
<?php
function make_clickable($text)
{
    if (ereg("[\"|'][[:alpha:]]+://",$text) == false)
    {
        $text = ereg_replace('([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])', '<a target=\"_new\" href="\\1">\\1</a>', $text);
    }
    return($text);
}
$text=make_clickable('http://codeismy.name');
?>

Таким же образом можно сделать подсветку кода ( highlighter ) заменяя массив паттернов на массив значений.

a

    Автор: Sergey

    ,




    Нет комментариев на "Фильтрация текста в PHP. Regex"

    Нет комментариев.


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов