Ваш ключ: необходима авторизация | MyProxy - бесплатный обменник валидных прокси между пользователями форума.

Учимся работать с регулярными выражениями (preg_match)

Тема в разделе PHP Devel Studio, создана пользователем ERROR404, 13 сен 2013.

Войдите для ответа
  1. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Синтаксис регулярных выражений


    Теперь самое интересное основа регулярных выражений - их синтаксис:


    | - означает логическое "или".


    #а|о# - шаблон ищет a, если не найдет, будет искать о.


    ˆ - этот знак в шаблоне обозначает, чтобы в начале обязательно стояли следующие за ним символы.


    #ˆп# - шаблон ищет п и найдет, если эта буква стоит первой.


    $ - этот знак в шаблоне обозначает , чтобы в конце обязательно стояли предшествующие ему символы.


    #т$# - шаблон ищет т и найдет, если он стоит последним.


    . - точка в шаблоне обозначает, что шаблон совпадет с любым символом строки, кроме \n.


    #.# - шаблон совпадет с любыми символами, кроме знака \n.


    *- этот знак в шаблоне обозначает количество совпадений, это числитель ноль или более раз.


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


    + - этот знак в шаблоне обозначает количество совпадений, это числитель 1 или более раз.


    #п+# - такой шаблон ищет п и найдет, если п будет находиться 1 или более раз.


    То есть, если "п" нет, то совпадения не будет. Если будет хотя бы одна буква "п", то совпадение будет.


    ? - этот знак в шаблоне обозначает количество совпадений, это числитель 0 или 1 раз.


    #п?# - шаблон ищет п и найдет только в том случае, если п будет находиться 0 или 1 раз. То есть, если в тексте нету букв "п", совпадение будет. Если в тексте будет одна буква "п", совпадение также будет. А если букв "п" от двух и больше, то совпадения не будет.


    { } - эти знаки в шаблоне обозначают сколько раз должно быть совпадение.


    ? тоже самое, что и {0,1} - ноль или один раз;


    * тоже самое, что и {0, } - ноль или более раз;


    + тоже самое, что и {1, } - один или более раз.


    То есть, первая цифра обозначает минимум совпадений, последняя - максимум. Если цифра максимальных совпадений не указана, то она обозначает бесконечность. Например,{2, } обозначает, что должно быть 2 и более совпадений.


    \ - обратный слеш в шаблоне обозначает подстановку.


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


    Подстановка метасимвола:


    \\ \. \| \( \) \[ \ \] \{ \} \? \* \+ \ˆ \/ \# \!


    Подстановка класса символов


    \d- любой цифровой символ[0-9]


    \D - любой не цифровой символ[Ր-9]


    \s- любой пробельный символ [\t\ \r\f\n\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 - в конце текста


    Подшаблоны


    В регулярных выражениях подшаблоны выделяют, заключая в круглые скобки. Для их обозначения кроме термина «подшаблон» также используют термин «подвыражение». Подшаблоны могут быть вложенными. Синтаксис шаблона ничем не отличается от синтаксиса самого шаблона.


    ( ) - эти знаки в шаблоне обозначают ограничители подшаблона, которые можно создавать и в дальнейшем ссылаться на них.


    Обратные ссылки


    //n - ссылка на подшаблон, где n - номер подшаблона.


    Модификаторы


    Функционирование регулярных выражений можно видоизменить используя модификаторы их значение и использование описано ниже.


    i - игнорировать регистр


    #шаблон#i будет искать шаблон, игнорируя регистр в тексте поиска.


    s - метасимвол. соответствует и символу\n, то есть классу[\0-\xFF]


    #шаблон#s будет искать шаблон, где . видит \n, то есть метасимвол точка будет так же возвращать и перевод каретки на новую строку.


    U - минимизировать числитель, то есть искать как можно меньше совпадений.


    #шаблон#U будет искать шаблон, с как можно меньшим совпадением раз. Если мы ставили в шаблоне#a?# - действие этого модификатора примерно такое же, как и минимизатора ? в самом шаблоне.


    m - претензии ˆ и $ учитывают \n


    #шаблон#m - если в шаблоне будут метасимволы ˆ и $, то претензия ˆ будет искать совпадение в начале строки, а претензия$ будет искать совпадение в конце строки.


    D - претензия$ не учитывает \n


    #шаблон#D - если в шаблоне есть метасимвол$,


    претензия $ будет искать совпадение в фактическом конце текста, игнорируя переводы каретки на новую строку \n.


    A - привязать шаблон к началу текста.


    #шаблон#A - будет искать шаблон только в фактическом начале теста.


    x - разрешить комментарии: пробел и #


    #шаблон#x - здесь в шаблоне разрешены пробел и #, как комментарии, поэтому пробел и # надо предварять слешем, если только они не обозначают комментарии.


    /слово


    #комментарий


    ищу/x


    будет искать словоищу. То есть, здесь игнорируются пробелы.


    X - воспринимать неверную подстановку как ошибку.


    S- предварительная оптимизация шаблона.


    e - используется в функции preg_replace() для ее активации.


    Функции в PHP для работы с регулярными выражениями


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


    preg_match() - выполняет проверку на соответствие регулярному выражению;


    preg_match_all() - выполняет глобальный поиск регулярного выражения в строке;


    preg_replace() - выполняет поиск и замену по регулярному выражению.


    preg_split()- разбивает строку по регулярному выражению.


    Теперь разберем подробно все эти функции. Естественно, с примерами.


    Функцияpreg_match()


    mixed preg_match ( string pattern, string subject [, array &matches [, int flags [, int offset]]] )


    Ищет в заданном тексте subject совпадения с шаблоном pattern.


    В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0]будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.


    Параметр flags может принимать следующие значения:


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


    Примеры


    Пример #1. Поиск подстроки "develstudio" в тексте


    // Символ "i" после закрывающего ограничителя шаблона означает


    // регистронезависимый поиск.


    if (preg_match('/develstudio/i', 'DevelStudio.3dn.ru - Уроки, Исходники, Помощь и многое другое.')) echo 'Вхождение найдено.';


    else echo 'Вхождение не найдено.';


    1.2.3.4.


    Конечно же результат - этого примера - вывод на экран текста "Вхождение найдено."


    Пример #2. Поиск слова "Уроки" в тексте


    /*


    \b обозначает границы слова, следовательно, только изолированное вхождение слова "web" будет соответствовать маске, в отличие от "webbing","cobweb" и других слов, содержащих "web".


    */


    if (preg_match('/\bУроки\b/i', 'DevelStudio.3dn.ru - Уроки, Исходники, Помощь и многое другое.')) echo "Вхождение найдено.";


    else echo "Вхождение не найдено.";


    1.2.3.4.5.


    Пример #3. Извлечение доменного имени из адреса


    // Извлекаем имя хоста из URL


    preg_match('/^(http:\/\/)?([^\/]+)/i', 'http://develstudio.ru/', $matches);


    $host = $matches[2];


    // извлекаем две последние части имени хоста


    preg_match('/[^\.\/]+\.[^\.\/]+$/', $host, $matches);


    echo $matches[0];
     
    13 сен 2013 #1
Загрузка...
Похожие темы
  1. ERROR404
    Ответов:
    0
    Просмотров:
    644
Top