Регулярные выражения (Статей: 6)

<?php

if (!preg_match('/^[\w\-\_\!\?\=\@\+\%]+$/', $pass))
{
   echo 'ошибка, пароль может содержать только 0-9 a-z A-Z - _ ! ? = @ + %';
}

if (!preg_match('/^[\w\-\_]+$/', $login))
{
   echo 'ошибка, логин может содержать только 0-9 a-z A-Z - _';
}

if (!preg_match('/^[а-яёйА-ЯЁЙ]+$/u', $name))
{
   echo 'ошибка, имя может содержать только русские буквы';
}

if (!preg_match('/^[а-яёйА-ЯЁЙ\s\-]+$/', $city))
{
   echo 'ошибка, город может содержать только а-я А-Я - и один пробел';
}

if (!preg_match('/^[а-яёйА-ЯЁЙ\w\s\-\_\!\?\(\)]+$/', $text))
{
   echo 'ошибка, сообщение не добавлено, разрешены символы 0-9 а-я А-Я - _ ! ? ()';
}

Site: Система управления сайтом
// Возвращает FALSE, если элемент формы пуст.
    public function required($str)
	{
		if ( ! is_array($str))
		{
			return (trim($str) == '') ? FALSE : TRUE;
		}
		else
		{
			return ( ! empty($str));
		}
	}
    
    // Возрвращает FALSE, если длина меньше, чем указано в параметре.
    public function min_length($str, $val)
	{
		if (preg_match("/[^0-9]/", $val))
		{
			return FALSE;
		}

		if (function_exists('mb_strlen'))
		{
			return (mb_strlen($str) < $val) ? FALSE : TRUE;
		}

		return (strlen($str) < $val) ? FALSE : TRUE;
	}
    
    // Возрвращает FALSE, если длина больше, чем указано в параметре.
    public function max_length($str, $val)
	{
		if (preg_match("/[^0-9]/", $val))
		{
			return FALSE;
		}

		if (function_exists('mb_strlen'))
		{
			return (mb_strlen($str) > $val) ? FALSE : TRUE;
		}

		return (strlen($str) > $val) ? FALSE : TRUE;
	}
    
    // Возвращае FALSE, если длина не соответствует указанной.
    public function exact_length($str, $val)
	{
		if (preg_match("/[^0-9]/", $val))
		{
			return FALSE;
		}

		if (function_exists('mb_strlen'))
		{
			return (mb_strlen($str) != $val) ? FALSE : TRUE;
		}

		return (strlen($str) != $val) ? FALSE : TRUE;
	}
    
    // Возвращает FALSE, если содержимое элемента формы меньше указанного или не является числовым значением.
    public function greater_than($str, $min)
	{
		if ( ! is_numeric($str))
		{
			return FALSE;
		}
		return $str > $min;
	}
    
    // Возвращает FALSE, если содержимое элемента формы больше чем указано, или не является числовым значением.
    public function less_than($str, $max)
	{
		if ( ! is_numeric($str))
		{
			return FALSE;
		}
		return $str < $max;
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме алфавитных символов.
    public function alpha($str)
	{
		return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме алфавитно-числовых символов.
    public function alpha_numeric($str)
	{
		return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме алфавитно-числовых символов, символов подчеркивания или дефисов.
    public function alpha_dash($str)
	{
		return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;
	}
    
    // Возвращает FALSE, если содержимое элемента формы не является числовым значением.
    public function numeric($str)
	{
		return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме целого числа.
    public function integer($str)
	{
		return (bool) preg_match('/^[\-+]?[0-9]+$/', $str);
	}
    
    // Возвращает FALSE, если содержимое элемента формы не является десятичным числом.
    public function decimal($str)
	{
		return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str);
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме натуральных чисел: 0, 1, 2, 3 и так далее.
    public function is_natural($str)
	{
		return (bool) preg_match( '/^[0-9]+$/', $str);
	}
    
    // Возвращает FALSE, если содержимое элемента формы содержит что-то кроме натуральных чисел, кроме ноля: 1, 2, 3 и так далее
    public function is_natural_no_zero($str)
	{
		if ( ! preg_match( '/^[0-9]+$/', $str))
		{
			return FALSE;
		}

		if ($str == 0)
		{
			return FALSE;
		}

		return TRUE;
	}
    
    // Возвращает FALSE, если элемент формы не содержит корректный адрес электронной почты.
    public function valid_email($str)
	{
	   return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
	}
    
    // Фильтрация строк
    public function doc($str)
    {
        $CI =& get_instance();
        
        // Пропускает данные через фильтр XSS.
        $str = $CI->security->xss_clean($str);
        
        // Фильтруем символы
        $str = nl2br($str);
        $str = preg_replace('!\p{C}!u', '', $str);
        $str = str_replace('<br />', "\n", $str);
        
        // Обрезает теги HTML от изображений, оставляя только URL.
        $str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str);
		$str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str);
        
        // Удаляем лишние пробелы
        $str = preg_replace('# {2,}#', ' ', $str);

        // Удаляем более 2-х переносов строк подряд
        $str = preg_replace("/(\n)+(\n)/i", "\n\n", $str);

        return trim($str);
    }
    
    // Фильтрация чисел
    public function abs($str)
    {
        return intval(trim($str));
    }
 
Что такое регулярные выражения?
Это замечательный инструмент для работы с текстом.
Такой же революционный, по сравнению с обычными строковыми функциями, как БД - по сравнению с текстовыми файлами. Это специальный язык для работы с текстом. Причём подчас одна строчка с использованием регулярных выражений может заменить страницу другую обычного кода!

С помощью регулярных выражений можно эффективно искать фрагменты текста любой сложности, заменять одни вхождения на другие.
Основа регулярного выражения - шаблон. С его помощью мы описываем формат нужного нам фрагмента текста, а затем либо проверяем, подходит ли текст под шаблон, либо выразаем одно или несколько вхождений шаблона, либо заменяем на какой-либо текст.
Метасимволы значение:
^ - начало
$ - конец
* - {0,}
+ - {1,}
? - {0,1}
{} - {от,до}
() - Под.Шаблон
[] - Ограничители классов символов
. - любой символ кроме \n
\ - Подстановка
------------------------
Немного о метасимволах:
\" - Двойная ковычка
\$ - знак доллара
\\ - обратный слеш
------------------------
Эти нимволы, только в таком, виде будут означать самих себя в строке.
------------------------
Другие метасимволы:
\ . | () [] {} ? * + ^ - /
------------------------
Подстановка метасимвола:
\\ \. \| \( \) \[ \] \{ \} \? \* \+ \^ \/ \# \!
------------------------
Подстановка непечатного символа:
\a \e \f \r \n \t \cx
------------------------
Подстановка печатного символа:
\x** - 16ричный
\*** - 8ричный
------------------------
Подстановка ссылки на подшаблон:
\{1,99} - (\\шаблон)
------------------------
Подстановка классов:
\d - [0-9] цифры
\D - [^0-9] не цифры
\s - [\t\r\f\n] любой пробельный символ
\S - [^t\r\f\n] любой не пробельный символ
\w - [a-zA-Z0-9_] любой алфавитно-цифровой символ
\W - [^a-zA-Z0-9_] любой не алфавитно-цифровой символ
------------------------
Кроми этого, классы символов можно обозначать так:
[[:alnum:]] - все алфавитно-цифровые символы [a-zA-Z0-9]
[[:alpha:]] - все алфавитные символы [a-zA-Z]
[[:blank:]] - символ табуляции и пробел [\t ]
[[:cntrl:]] - все управляющие символы
[[:digit:]] - все десятичные цифры [0-9]
[[:graph:]] - все печатные символы, за исключением пробела
[[:lower:]] - все строчные буквы [a-z]
[[:upper:]] - все прописные буквы [A-Z]
[[:print:]] - все печатные символы
[[:punct:]] - все знаки препинания [\.,;:-]
[[:space:]] - все пустые символы
[[:xdigit:]] - все шестнадцатиричные цифры
------------------------
Если вы поставите [^[:alnum:]] - любой не алфавитно-цифровой символ, то есть это полная противоположность [[:alnum:]].
То есть, любой класс вы можете интервировать посредствам '^'.
------------------------
Подстановка претензий:
\b - на границе слова
\B - не на границе слова
\A - в начале строки
\Z - в конце строки
\z - в конце текста
------------------------
Ниже перечислены все доступные на сегодняшний день модификаторы. Имя, взятое в круглые скобки, указывает внутреннее PCRE имя для данного модификатора.

i (PCRE_CASELESS)
Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.

m (PCRE_MULTILINE)
По умолчанию PCRE обрабатывает данные как однострочную символьную строку (даже если она содержит разделители строк). Метасимвол начала строки '^' соответствует только началу обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу текста, либо позиции перед завершающим текст переводом строки (в случае, если модификатор D не установлен). В Perl ситуация полностью аналогична. Если этот модификатор используется, метасимволы "начало строки" и "конец строки" также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после. Это соответствует Perl-модификатору \m. В случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.

s (PCRE_DOTALL)
Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем символам, включая перевод строк. Без него - всем, за исключением переводов строк. Этот модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании, например [^a], всегда соответствует переводу строки, независимо от наличия этого модификатора.

x (PCRE_EXTENDED)
Если данный модификатор используется, неэкранированные пробелы, символы табуляции и пустой строки в шаблоне игнорируются, если они не являются частью символьного класса. Также игнорируются все символы между неэкранированным символом '#' (если он не является частью символьного класса) и символом перевода строки (включая сами символы '\n' и '#'). Это эквивалентно Perl-модификатору \x, и позволяет размещать комментарий в сложных шаблонах. Замечание: это касается только символьных данных. Пробельные символы не фигурируют в служебных символьных последовательностях, к примеру, в последовательности '(?(', открывающей условную подмаску.

e
Если данный модификатор используется, preg_replace() после выполнения стандартных подстановок в заменяемой строке интерпретирует ее как PHP-код и использует результат для замены искомой строки.

Только preg_replace() реагирует на данный модификатор; остальными функциями он игнорируется.

Замечание: Этот модификатор недоступен в PHP 3.

A (PCRE_ANCHORED)
Если данный модификатор используется, соответствие шаблону будет достигаться только в том случае, если он соответствует началу строки, в которой производится поиск. Того же эффекта можно достичь подходящей конструкцией с вложенным шаблоном, которая реализуема в Perl.

D (PCRE_DOLLAR_ENDONLY)
Если данный модификатор используется, метасимвол $ в шаблоне соответствует только окончанию обрабатываемых данных. Без этого модификатора метасимвол $ соответствует также позиции перед последним символом, в случае, если им является перевод строки (но не распространяется на любые другие переводы строк). Данный модификатор игнорируется, если используется модификатор m. В языке Perl аналогичный модификатор отсутствует.

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

U (PCRE_UNGREEDY)
Этот модификатор инвертирует жадность квантификаторов, таким образом они по умолчанию не жадные. Но становятся жадными, если за ними следует символ '?'. Такая возможность не совместима с Perl. Модификатор U также может использоваться внутри шаблона, при помощи '?U' записи.

X (PCRE_EXTRA)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: любой обратный слеш в шаблоне, за которым следует символ, не имеющий специального значения, приводят к ошибке. Это обусловлено тем, что подобные комбинации зарезервированы для дальнейшего развития. По умолчанию же, как и в Perl, слеш со следующим за ним символом без специального значения трактуется как as опечатка. На сегодняшний день это все возможности, которые управляются данным модификатором

J (PCRE_INFO_JCHANGED)
Модификатор (?J) меняет значение опции PCRE_DUPNAMES - подшаблоны могут иметь одинковые имена.

u (PCRE_UTF8)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблоны обрабатываются как UTF8 строки. Модификатор u доступен в PHP 4.1.0 и выше для Unix-платформ, и в PHP 4.2.3 и выше для Windows платформ. Валидность UTF8 в шаблоне проверяется начиная с PHP 4.3.5.
Синтаксис регулярных выражений
Регулярное выражение Означает
foo Строка “foo”
^foo Строка начинается с “foo”
foo$ Строка заканчивается на “foo”
^foo$ «foo» встречается в строке только один раз
[abc] a, b, или c
[a-z] любой символ в нижнем регистре
[^A-Z] любой символ, не находящийся в верхнем регистре
(gif|jpg) Означает как «gif” так и “jpeg”
[a-z]+ Один или более символов нижнего регистра
[0-9.-] Любая цифра, точка или знак минус
^[a-zA-Z0-9_]{1,}$ Любое слово, хотя бы одна буква, число или _
([wx])([yz]) wy, wz, xy, или xz
(^A-Za-z0-9) Любой символ (не число и не буква)
([A-Z]{3}|[0-9]{4}) Означает три буквы или 4 цифры
PHP-функции для регулярных выражений
Функция Описание
preg_match() Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях
preg_match_all() Функция preg_match_all() находит все вхождения строки, заданной по шаблону
preg_replace() Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение.
preg_split() Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска.
preg_grep() Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения.
preg_quote() Экранирует символы регулярного выражения
Облако тегов / Авторы