PHP. ПОИСК С ПОМОЩЬЮ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ

Проверить можно тут: gskinner.com/RegExr

Пример:
$user = $_POST['username'];
if(!preg_match("/^[a-zA-Z0-9_]+$/", $user))
{echo "Имя пользователя задано в неправильном формате";}
else {
    echo "Имя пользователя задано в правильном формате";
}

Пример: ищем цены в тексте в виде: $xx.xx
preg_match_all("/<b>\$(\d+.\d+),/b>/", $text, $matches);
var_dump($matches); // посмотреть результат массива
или
for ($i=0; $i<count($matches[1]); $i++) {
    echo $matches[1][$i]
}
// в $matches[0][$i] будет результат, в котором было найдено регулярное выражение, т.е. <d>$xx.xx</b>, а в $matches[1][$i] только $xx.xx

 

 

$text0 = preg_replace("/(<.?span>|<.?ul([^>]*){1}>)/si","",$text0); // удаляем оставшийся <ul> и ид

 

 preg_match_all('#\$(\d+.\d+)#', $text0, $matches); //что ищем, где ищем, куда записуем
//var_dump($matches); // посомтреть результат массива
for ($i=0; $i<count($matches[1]); $i++)
{
$text0 = str_replace("$".$matches[1][$i], "<smal>".intval(1+$matches[1][$i]*$kursUAN)."грн ".intval(1+$matches[1][$i]*$kursWMU)."wmu ".intval(1+$matches[1][$i]*$kursWMZ)."wmz", $text0); //ищем цену в долларах и земеняем
// floatval () - преобразуем строку в число с запятой
// intval() - преобразуем строку в целое число
}

 

preg_replace (регулярка, на_что_меняем, где_ищем[, лимит [, кол_во ]] ) - ищет совпадения регулярного выражения и заменяет их.
preg_filter (регулярка, на_что_меняем, где_ищем[, лимит [, кол_во ]] ) - аналогична возвращает preg_replace, только возвращает те значения (возможно, преобразованные), в которых найдено совпадение.
preg_grep (регулярка, где_ищем[, флаг = 0 ] ) - ищет массив вхождений, которые соответствуют регулярке. Если флаг = PREG_GREP_INVERT, то вернёт элементы массива, которые не соответствуют регулярке
preg_split - разбивает строку по регулярному выражению

регулярка - регулярное выражение (шаблон поиска), тип данных: string, array
на_что_меняем - тип данных: string, array
где_ищем - тип данных: string, array
лимит - максимально количество замен. По умолчанию равно "-1" (не ограниченно), тип данных: int
кол_во - количество произведенных замен,  тип данных: int

 

Регулярное выражение выделяется одинаковыми спец. символами, например: "/...../"  или '#.....#' и т.д.
"/./" - ищем любой символ за исключением символа перевода строки.
"/.*/i" - ищем сколько угодно без учёта регистра символов.
"/.*/s" - ищем сколько угодно и перевод строки. Т.е. выражение "/.*/" вернёт только первую строку.
"/
.*/U"
- ищет и не жадничает сколько угодно любых символов кроме перевода строки, т.е. не весь кусок текста, а первое совпадение.
u - строка в UTF-8 еще: http://www.pcre.ru/docs/php/text/stdmod/

можно добавлять несколько модификаоров.

"/(.*)/" - ищем сколько угодно которые надо запомнить.

"/\./" - ищем точку
"/\\/" - ищем обратный слеш
"/\\\\/" - ищем двойной обратный слеш
"/\|/" - ищем |
"/\//" - ищем слеш /

"/[om]/" - ищем либо "o" либо "m"
"/[abcdefghijklmnoprqtsuvwxyz]/" - ищем любую букву от "a" до "z" или
"/[a-z]/" - ищем любую букву от "a" до "z"
"/[а-я]/" - ищем любую букву от "a" до "я"
"/[0-9]/" - ищем любую цифру
"/[A-Z]/" - ищем заглавные буквы от "A" до "Z"
"/[a-fq-x]/" - ищем буквы латинского алфавита от "a" до "f" и от "q" до "x"
"/[a-zA-Z]/" - ищем любую букву латинского алфавита
"/[14a-kz]/" - ищем символ в строке "1", "4", буквами латинского алфавита c "a" по "k", а так же букву "z"
"/[-,a-z]/" - ищем минус, запятую, а так же буквы латинского алфавита от "a" до "z".

"/[a-z][a-z][a-z][a-z][0-9][0-9][0-9][0-9][0-9]/" - найти в тексте четыре буквs вначале, сразу после которых идут пять цифр или
"/[a-z]{4}[0-9]{5}/" - где в скобках указано кол-во
"/[a-z]{4}([0-9]{5}) /" - то, что надо запомнить, выделено круглыми скобками
"/[a-z]{1,3}/" - означает, что подряд может идти от одного до трех букв латинского алфавита
"/[a-z]{2,}/" - означает, что может идти минимум 2 буквы латинского алфавита подряд
"/[a-z]*/" - означает, что подряд может идти сколь угодно букв латинского алфавита, а может быть, что и ни одной или
"/[a-z]{0,}/" - см. выше
"/[a-z]+/" - означает, что обязательно подряд должна идти минимум одна буква латинского алфавита, но максимальное количество не указано или
"/[a-z]{1,}/" - см. выше
"/[a-z]?/" - означает, что количество латинских букв не должно превышать одну, буква также может вообще отсутствовать, идентично
"/[a-z]{0,1}/" - см. выше
"/[a-z ]/" - ищем от а до z и пробел

"/\s/" - ищем пробел или табулятор, или перевод строки
"/\S/" - ищем видимый символ, т.е. то, что не совпадает с \s
"/\w/" - ищем символ, который может входить в слово, обычно это [a-zA-Z_], хотя много может зависеть от установленной локали, поддержки юникода и т.д.
"/\W/" - ищем то, что не входит в определение \w. или [^a-zA-Z_]
"/\d/" - ищем цифру или [0-9]
"/\D/" - ищем то, что не является цифрой
"//bслово/b/" - выделяем слово для поиска
"/
[a-z\s]/"
- ищем от а до z и пробел или табулятор, или перевод строки

"/[^abc]/" - ищем символы (не буквы, а именно символы) кроме букв латинского алфавита "a", "b", "c".
"/[^>]/" - ищем всё кроме >
"/[^>]*/" - ищем всё кроме > сколько угодно
"/[^>]*{12}/" - ищем всё кроме > сколько угодно но не больше 12 раз
"/([^>]*){12}/" - ищем всё кроме > сколько угодно но не больше 12 раз и запоминаем

"/^[.......]/" - а здесь знак "^" означает начало строки
"/^[.......]$/" - знак "$" - означает конец строки, т.е. условию должна соответствовать вся строка
"/^[a-zA-Z][a-zA-Z0-9]*$/" - первая буква латинского алфавита, далее буквы и цифры или вообще их может не быть (симол "*")






| - или, пример: preg_match("/^(be)|(not\sto\sbe)$/", $alternate, $answer);
Регулярное выражение совпадет в случае
* если $alternate равно "be"
* если $alternate равно "not to be"
ещё пример: s(o|u)n совпадет как с "son", так и с "sun" или так записать: (son)|(sun)

() - то, что надо запомнить, выделено круглыми скобками, совпадение будет запоминаться в специальных переменных,
в PHP к ней можно обращаться через \1 в Perl - $1. В одном условии поиска может быть несколько инструкций запоминания:
([a-z]{5})([1-8]{4}) - проверит строку на совпадение с условием, в случае удачного совпадения, запомнит пять букв в \1 ($1),
четыре цифры в \2 ($2). Если обратиться к переменной \0, то окажется, что в ней хранится вся совпавшая строка, которая была описана условием.

В случае с выбором между группами литералов, либо между одиночными литералами, литералы объединяются при помощи круглых скобок,
но если нам не нужно запоминать выделенные группы литералов, на надо их сгруппировать, т.е. поместить в круглые скобки, то
делается так: (?:be)|(?:not\sto\sbe) теперь ни группа литералов "be" ни группа литералов "not to be" не будут
заноситься в переменные \1, \2 (Perl $1, $2), но зато будут отлично группироваться.

ПРИМЕР:

Есть список пользователей в формате:
фамилия имя отчество
фамилия и о
фамилия и.о.
Надо сделать в виде:
фамилия ио.

...
preg_match("/([^\s]+)\s+([^\s.])[^\s.]*(?:\s|\.)([^\s.])[^\s.]*/",$income_str,$out_arr);
print_r($out_arr);
...

[^\s] - любой символ, который не является пробелом! включая символ новой строки, можно было написать \S без крышки вначале символьного класса, но это на любителя.
[^\s]+ - минимум один символ, который не является пробелом, т.е. фамилию мы уже описали, но её надо запомнить:
([^\s]+) - запоминаем фамилию

\s+ - минимум один пробел между фамилией и именем

[^\s] - все что не пробел, первый обязательный символ имени (сокращения)
[^\s.] - все что не пробел и не точка
[^\s.]* - в случае полного имени, это будет означать, что надо найти все, что не точка и не пробел и идет после обязательного первого символа имени, который мы описали выше
т.е. имя:
[^\s.][^\s.]* но первую букву имени (даже если там сокращение) по условию задачи надо запомнить:

([^\s.])[^\s.]* - запоминаем первую букву имени

После имени идет пробел либо точка, значит выбераем из двух символов:
(\s|\.) - выбор между двумя литералами, а вдруг там не один пробел, ставм "+"
(\s+|\.)
То, что стояло между фамилией и отчеством, пробел или точка нам не нужно, значит не запоминаем:
(?:\s|\.)

Для отчества аналогично.

Вторая часть http://www.opennet.ru/base/dev/php_regexp.txt.html:
 

Ретроспективная проверка

(?<=слева)что ищем(?=справа)
(?<!слева)что не должно быть(?!справа)

Например, надо выковырять последнюю цену, которая находится меду тегами <a>... </a>:
<TD><B>35.05</B>
<TD><A href="...." onclick="....">26.92</A>
<BR><A href="...." onclick="....">27.05</A>

Т.е. для поиска цены: \d*\.\d*

(?<=>)\d*\.\d*(?=</a>)
но эта запись две записи выковыряет, надо добавить:

preg_match_all ("/(?<!<TD>)(?<=>)\d*\.\d*(?!<\/B>)(?=<\/A>)/", $string, $matches);
print_r ($matches);

Ретроспективная проверка не позволяет делать проверки на совпадение текста произвольной длинны. То есть нельзя делать, например, такую проверку: /(?<=\d+)

ещё примеры http://htmlweb.ru/php/example/preg.php

 

//-----------------------------------------------------------
// Граббер сайта, загружает и парсит, текст помещает в массивв
//-----------------------------------------------------------

// $grab=@file_get_contents("http://bash.org.ru"); //Самый простой способ при помощи функции file_get_contents
if ($grab)
{
$grab=str_replace("<br>","\n",$grab); // Заменить теги переноса строки на простые переносы строки

// preg_match_all - ищет все совпадения с шаблоном
preg_match_all("/<div class=\"vote\">([^>]*>){12}([^<]*)/",$grab,$matches); // Получить регулярным выражением тексты цитат

// В массиве содержатся все найденные строки
for ($i=0; $i<count($matches[2]); $i++) {
echo nl2br($matches[2][$i]);
echo '<hr>';
}
}
else {
echo "ОШИБКА";
} }



?>