Не работает регулярное выражение php

Глюк регулярных выражений в PHP при работе с UTF-8

Нашел такую вещь: если указывать модификатор ‘u’ (PCRE_UTF8), который предписывает интерпретировать шаблон как строку в utf-8 (см. также http://ru2.php.net/manual/ru/reference.pcre.pattern.modifiers.php), для русских букв работает регистронезависимое сопоставление, но в то же время русские буквы не считаются буквами!

Особенно странное заключается в том, что без модификатора буква распознаётся (хотя регистронезависимое сопоставление, конечно же, не работает, что, впрочем, не странно):

Неожиданным оказалось, что, если сохранить скрипт, например, в кодировке cp-1251, то сопоставление букв разного регистра может проходить успешно:

Проверялось всё это на PHP 5.2.4 под Windows.

Немало удивил также результат проверки на PHP 5.1.6 под Linux: отсутсвие совпадения для всех шести описанных случаев, т.е. модификатор PCRE_UTF8 не работает вообще.

Что бы с этим сделать, как думаете?

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

rgbeast

1234ru

Такая же ситуация с mb_ereg(). Проверялось под Linux (PHP 5.1.6).

Кстати, я что-то не пойму, зачем было делать две разных функции: mb_ereg() и mb_ereg_match().

rgbeast

Синтаксис у функцмм другой, модификаторов нет:
echo mb_ereg_match(‘г’, ‘Г’);

1234ru

Зачем вообще эти ereg()? Ведь надо ж было переделать под mb_ четыре функции: preg_match(), preg_match_all, preg_replace() и preg_replace_callback(). Пока этого нет, будет всё через одно место.

Представь себе это основные функции для работы с регулярками в ПХП.

А preg_& это Perl style, портированный в PHP по просьбам трудящихся.

По поводу того как использовать *ereg* функции, передавать модификаторы и получать вхождения достаточно развернуто сказано на php.net. А по поводу в чем сильные и слабые стороны обоих стандартов холи варов миллион было уже. В т.ч. и сравнительные тесты производительности найти не проблема.

Есть подозрения, что mb_preg* никогда не будет, именно потому что этот стиль подразумевает модификаторы, в т.ч. «u», А в ereg* модификаторов вообще небыло, вместо них плодят разные функции типа ereg i и mb_ereg.

И тут мы плавно подошли к главному, в ereg нет и не надо (!) модификаторов.

echo mb_ereg(‘Г’, ‘Г’); // так матчим
echo mb_eregi(‘г’, ‘Г’); // так матчим регистронезависимо

1234ru

Что-то не нашел я в описании функции ereg() возможности передавать модификаторы.

Что будем делать, когда понадобятся ‘s’, ‘m’ и др.?

Serg_pnz

upd: это тоже не прокатило

Serg_pnz

Не фонтан, но вроде работает для моей узкой задачи.

2admin: сделайте «шапку» для оформления кода php по примеру цитаты16.03.2009, 15:57
Ответить

1234ru

1234ru

P.S. Извините, что поздно ответил. Диссертация одолевает.

Serg_pnz

u должна быть u или U?

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php20.03.2009, 19:58
Ответить

1234ru

Странно.. Что, вот прямо приводимый мной пример не работает?
Какая версия PHP?

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

Да, кстати. У Вас точно файл в UTF-8? Проверьте на всякий случай.

Serg_pnz

В который раз выручили! Всё прекрасно работает и без изврата с перекодировкой.

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php21.03.2009, 15:01
Ответить
Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Serg_pnz

Еще одна заморочка для utf-8

Пользователь вводит данные на русском языке и проверка

Пришлось извратиться так

1234ru

Serg_pnz

dskarataev

Так что же все-таки является самым правильным решением?

1.каждый раз при использовании регулярных выражений делать конвертацию через iconv()
2.переучиваться на синтаксис PHP (ereg)
3.100% решением является использование [a-zA-Zа-яА-Я0-9] и модификатора u

хотелось бы конечно третье 🙂

07.10.2010, 17:27
Ответить

1234ru

Источник

Почему не работает регулярное выражение

Первый вариант работает:

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Второй вариант не работает:

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Вопрос: почему во 2 варианте не выполняется последнее условие?

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

1 ответ 1

Полагаю все дело в семантике. в первом варианте проверка и фиксация этой проверки идет вместе с последним блоком.

То есть в первом варианте регулярке для фиксации и переходна на след символ интересны только те 3 ноля, поcле которых нету цифр. И он или находит одно единственное удовлетворение своим желанием или не одного. а во втором варианте ему просто нужны 3 цифры, а потом он на одном из шагов (смещение с фиксацией посимвольное происходит) внезапно для себя замечает, что он еще не набрал 3 ноля, а впереди уже и нету «не цифры»

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

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php регулярные-выражения или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.17.40238

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

PHP и регулярные выражения: азы для новичков

В преддверии старта нового потока по курсу «Backend-разработчик на PHP», а также смежного с ним курса «Framework Laravel», хотим поделиться статьей, которую подготовил наш внештатный автор.

Внимание! данная статья не имеет отношения к программе курса и будет полезна только для новичков. Для получения более углубленных знаний приглашаем вас посетить бесплатный двухдневный онлайн интенсив по теме: «Создание Telegram-бота для заказа кофе в заведении и оплаты онлайн». Второй день интенсива будет проходить тут.

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Всем привет! Всех с наступившим [20]<2,>0 годом. Сегодня я хочу затронуть тему, которая иногда является темой для шуток от «Да зачем тебе все это учить, если есть уже есть готовые решения» до «может тебе еще и весь Perl выучить?». Однако время идет, множество программистов начинают осваивать регулярные выражения, а на Хабре нет ни одной свежей (хоть регулярные выражения не слишком изменились за последнее время) статьи на этой тематику. Пришло время написать ещё одну!

Регулярные выражения в отрыве от их конкретной реализации

Регулярные выражения (обозначаемые в английском как RegEx или как regex) являются инструментальным средством, которое применяется для различных вариантов изучения и обработки текста: поиска, проверки, поиска и замены того или иного элемента, состоящего из букв или цифр (или любых других символов, в том числе специальных символов и символов пунктуации). Изначально регулярные выражения пришли в мир программирования из среды научных исследований, которые проводились в 50-е годы в области математики.

Спустя десятилетия принципы и идеи были перенесены в среду операционной системы UNIX (в частности вошли в утилиту grep ) и были реализованы в языке программирования Perl, который на заре интернета широко использовался на бэкенде (и по сей день используется, но уже меньше) для такой задачи, как, например, валидация форм.

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Если они вроде простые, тогда почему такие страшные на первый взгляд?

На самом деле любое выражение может быть «регулярным» и применяться для проверки или поиска каких-либо символов. Например, слова Pavel или example@mail.ru тоже могут использоваться как регулярки, только, понятное дело, в довольно узком ключе. Для проверки работы регулярных выражений в среде PHP без запуска своего сервера или хостинга вы можете воспользоваться следующим онлайн сервисом (вот только на нем у меня не работала обработка русских символов). Для начала в качестве регулярного выражения мы используем просто Pavel.

Положим у нас есть следующий текст:

Pavel knows too much. Pavel using nginx and he’s not rambler.

Сейчас регулярные выражения нашли оба вхождения слова Pavel. Здорово, но звучит не очень полезно (разве что только вы зачем-то пытаетесь проанализировать что-то вроде количества упоминания слова сударь в Войне и Мире через Vim и Python, но тогда у меня к вам вопросов нет).

Вариативность выражения

Если ваше регулярное выражение вариативно (например, вам известна только некоторая его часть и нужно найти количество вхождений годов, начиная от 2000 и заканчивая 2099), то мы можем использовать следующее регулярное выражение: 20..

Текст: Молодые писатели пишут много чего. Например писатель 2002 года рождения очень отличается от 2008 и 2012

Здесь у нас с помощью регулярного выражения найдутся все годы, но пока в этом нет никакого смысла. Скорее всего нам не нужны годы дальше 2012 (хотя молодые писатели младше 8 лет могут обидеться, но не об этом сейчас). Стоит изучить наборы символов, но об этом попозже, потому как сейчас поговорим про другую важную часть регулярных выражений: экранирование метасимволов.

Регулярное выражение: \.doc

Совпадение с целым набором символов

Регулярное выражение: 2\.jpg

Текст: 1.jpg, 2.jpg, 3.jpg, photo.jpg, anime.jpg, 8.jpg, jkl.jpg

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

Регулярное выражение: [^0-9]\.jpg

Но без множественного выбора это конечно неполноценные выражения.

Полезные таблицы

Приведем таблицу метасимволов:

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php
\экранировать метасимвол как обычный символ
^искать определенный символ именно в начале строки (но только если исключить его из набора [])
$конец строки
|альтернатива
()группировка
\wвсе буквенно и цифровые символы (многие руководства почему-то не договаривают про цифровые символы)
\Wтоже самое, только наоборот
\sлюбой пробельный символ
\Sлюбой НЕ пробельный символ

Таблица пробельных метасимволов

[\b]возврат на один символ
\fперевод страницы
\nперевод строки
\rвозрат каретки
\tтабуляция
\vвертикальная табуляция

Множественный выбор: делаем простую валидацию

Регулярное выражение: \b\w<1,3>\b:

Неплохо! Теперь слова короче трех букв не смогут попадать в нашу базу данных. Посмотрим на валидацию почтового адреса:

Регулярное выражение: \w+@\w+\.\w+

Подробнее рассмотрим повторение символов

Теперь давайте поподробнее разберем, как можно в регулярных выражениях задать повторение символов. К примеру вы хотите найти любые комбинации цифр от 2-6 в тексте:

Регулярное выражение: 5+

Давайте я приведу таблицу всех квантификаторов метасимволов:

*символы повторяются 0 и до бесконечности
+повторяются от 1 и до бесконечности
повторяются точно n раз
от n и до бесконечности
от n1 и до n2 раз точно
?0 или 1 символ, не больше

В применении квантификаторов нет ничего сложного. Кроме одного нюанса: жадные и ленивые квантификаторы. Приведем таблицу:

Ленивые квантификаторы отличаются от жадных тем, что они выхватывают минимальное, а не максимальное количество символов. Представим, что есть у нас задача найти все теги заголовков h1-h6 и их контент, а весь остальной текст не должен быть затронут (я умышленно ввел несуществующий тэг h7, чтобы не мучаться с экранированием хабровских тэгов):

Текст: h7 > hello h7 > lorem ipsum avada kedavra h7 > buy /h7 >

Все сработало успешно, однако только благодаря ленивому квантификатору. В случае применения жадного квантификатора у нас выделился бы весь текст между тегами (полагаю, в иллюстрации это не нуждается).

Границы символьных строк

Границы символьных строк мы уже использовали выше. Приведем здесь более подробную таблицу:

\bграница слова
\Bне граница слова
\Aначало строки
\Zконец строки
\Gконец действия
Работа с подвыражениями

Текст: 255.255.255.255 просто адрес
191.198.174.192 wikipedia
87.240.190.67 vk
31.13.72.36 facebook

Здесь используется логический оператор | (или), который позволяет нам составить регулярное выражение, которое соответствует правилу, по которому составляются IP- адреса. В IP адресе должно быть от 1 и до 3 цифр, в котором число из трех чисел может начинаться с 1, с 2 (или тогда вторая цифра должна быть в пределах от 0 и до 4), или начинаться с 25, и тогда 3 цифра оказывается в пределах от 0 и до 5. Также между каждой комбинацией цифр должна стоять точка. Используя приведенные выше таблицы, постарайтесь сами расшифровать регулярное выражение сверху. Регулярные выражения в начале пугают своей длинной, но длинные не значит сложные.

Просмотр вперед

Приведем конкретную задачу: есть пароль, который должен состоят не менее чем из 7 символов и должен обязательно включать как минимум одну заглавную букву и цифру. Здесь все будет несколько сложнее, потому как пользователь должен иметь возможность поставить заглавную букву как в начале, так и в середине предложения (и тоже самое должно повторяться с буквой).

Следовательно, нам потребуется просмотр выражения вперед. Кроме того, нам нужно разбить на группы знаки. И я хочу ограничить его размеры от 8 и до 22 знаков:

Текст: Qwerty123
Im789098
weakpassword

Особенности работы регулярных выражений именно в PHP

Для изучения работы регулярных выражений в PHP, изучите функции в официальной документации PCRE (Perl Compatible Regular Expressions) которая доступна на официальном сайте. Выражение должно быть заключено в разделители, например, в прямые слеши.

Разделителем могут выступать произвольные символы, кроме буквенно-цифровых, обратного слеша ‘\’ и нулевого байта. Если символ разделителя встречается в шаблоне, его необходимо экранировать \. В качестве разделителей доступны комбинации, пришедшие из Perl: (), <>, [].

Какие функции используются в php? В пакете PCRE предоставляются следующие функции для поддержки регулярных выражений:

Замещающие строки допускается вычислять в виде кода PHP. Для активизации данного режима служит модификатор e.

Наша статья была бы неполной без классов символов POSIX, которые также работают в PHP (и в общем вполне могут повысить читабельность ваших регулярок, но не все их спешат учить, потому как часто ломают логику выражения).

[[:alnum:]]Любая буква английского алфавита или цифра
[[:alpha:]]Любая буква ([a-zA-Z])
[[:blank:]]Пробельный символ или символ с кодом 0 и 255
[[:digit:]]Любая цифра (2)
[[:lower:]]Любая строчная буква английского алфавита ([a-z])
[[:upper:]]Любая заглавная буква английского алфавита ([A-Z])
[[:punct:]]Любой знак пунктуации
[[:space:]]Любой пробельный символ
[[:xdigit:]]Любая шестнадцатеричная цифра ([0-9a-fA-F])

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

Всем спасибо за внимание! Конечно, сегодня мы затронули только часть регулярных выражений и о них можно написать ещё несколько статей. К примеру, мы не поговорили о реализации поиска повторений одинаковых слов в тексте. Но я надеюсь, что полученных знаний хватит, чтобы осмысленно написать свою первую валидацию формы и уже потом перейти к более зубодробительным вещам.

По традиции, несколько полезных ссылок:

Шпаргалка от MIT по регулярным выражениям
Официальная часть документации php по регулярным выражениям.

На этом все. До встречи на интенсиве!
Второй день интенсива пройдет тут

Источник

PHP регулярные выражения (выражение не работает или работает не так)

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Всем привет )))
Возникла проблема в написании регулярного выражения.
Подскажите кто что может.

Банки и банковский менеджмент

То что выделено то что выделено квадратными скобками[] нужно удалить через PHP функция ereg_replace

6 ответов

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Спасибо, но это не то.

Уже разобрался, и кстати благодаря Вам.
Как оказалось нужно было функцию другую использовать, не ereg_replace а preg_replace, да и синтаксис в справочнике то что нашол не полный был.

Ранее думал что эти функции одинаковы 🙂

Да и кстати почемуто регулярное выражение работает только в том случае если заключино между |регуляр выражение|
Вот само регулярное выражение
|\s*[\wа-яА-ЯёЁ:,;/\-\s\.\»\(\)\”\“]*

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Потому что у вас / является границами рег.выражения, а также встречается внутри регулярного выражения, потому \ (идущий после / внутри) считается модфикатором, а такого нету, оттуда и ошибка. Экранируйте, а дучще ставьте другие ограничители, ту же решетку.

А че мой-то не подходит?

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Ваш не подходит так как Вы не совсем правельно поняли вопрос.

Банки и банковский менеджмент

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

Подскажите пожалуйста какие знаки могут быть еще границами регулярного выражения

А еще лучше подскажите ресурсы где можно регулярные выражение подробно изучить.

Источник

Регулярные выражения для самых маленьких

Меня зовут Виталий Котов и я немного знаю о регулярных выражениях. Под катом я расскажу основы работы с ними. На эту тему написано много теоретических статей. В этой статье я решил сделать упор на количество примеров. Мне кажется, что это лучший способ показать возможности этого инструмента.

Некоторые из них для наглядности будут показаны на примере языков программирования PHP или JavaScript, но в целом они работают независимо от ЯП.

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

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

Не работает регулярное выражение php. Смотреть фото Не работает регулярное выражение php. Смотреть картинку Не работает регулярное выражение php. Картинка про Не работает регулярное выражение php. Фото Не работает регулярное выражение php

Вступление

Регулярные выражения — язык поиска подстроки или подстрок в тексте. Для поиска используется паттерн (шаблон, маска), состоящий из символов и метасимволов (символы, которые обозначают не сами себя, а набор символов).

Это довольно мощный инструмент, который может пригодиться во многих случая — поиск, проверка на корректность строки и т.д. Спектр его возможностей трудно уместить в одну статью.

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

Функции на match возвращают число найденных подстрок или false в случае ошибок. Функция на replace возвращает измененную строку/массив или null в случае ошибки. Результат можно привести к bool (false, если не было найдено значений и true, если было) и использовать вместе с if или assertTrue для обработки результата работы.

В JS чаще всего мне приходится использовать:

Пример использования функций

В PHP регулярное выражение — это строка, которая начинается и заканчивается символом-разделителем. Все, что находится между разделителями и есть регулярное выражение.

Часто используемыми разделителями являются косые черты “/”, знаки решетки “#” и тильды “

”. Ниже представлены примеры шаблонов с корректными разделителями:

Создать регулярное выражение можно так:

Или более короткий вариант:

Пример самого простого регулярного выражения для поиска:

В этом примере мы просто ищем все символы “o”.

В PHP разница между preg_match и preg_match_all в том, что первая функция найдет только первый match и закончит поиск, в то время как вторая функция вернет все вхождения.

Пример кода на PHP:

Пробуем то же самое для второй функции:

В последнем случае функция вернула все вхождения, которые есть в нашем тексте.

Тот же пример на JavaScript:

Модификаторы шаблонов

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

О том, какие вообще бывают модификаторы, можно почитать тут.

Пример предыдущего регулярного выражения с модификатором на JavaScript:

Метасимволы в регулярных выражениях

Примеры по началу будут довольно примитивные, потому что мы знакомимся с самыми основами. Чем больше мы узнаем, тем ближе к реалиям будут примеры.

Чаще всего мы заранее не знаем, какой текст нам придется парсить. Заранее известен только примерный набор правил. Будь то пинкод в смс, email в письме и т.п.

Первый пример, нам надо получить все числа из текста:

Чтобы выбрать любое число, надо собрать все числа, указав “[0123456789]”. Более коротко можно задать вот так: “2”. Для всех цифр существует метасимвол “\d”. Он работает идентично.

Но если мы укажем регулярное выражение “/\d/”, то нам вернётся только первая цифра. Мы, конечно, можем использовать модификатор “g”, но в таком случае каждая цифра вернется отдельным элементом массива, поскольку будет считаться новым вхождением.

Для того, чтобы вывести подстроку единым вхождением, существуют символы плюс “+” и звездочка “*”. Первый указывает, что нам подойдет подстрока, где есть как минимум один подходящий под набор символ. Второй — что данный набор символов может быть, а может и не быть, и это нормально. Помимо этого мы можем указать точное значение подходящих символов вот так: “”, где N — нужное количество. Или задать “от” и “до”, указав вот так: “”.

Сейчас будет пара примеров, чтобы это уложилось в голове:

Примерно так же мы работает с буквами, не забывая, что у них бывает регистр. Вот так можно задавать буквы:

Такое выражение выберет все слова, которые есть в предложении и написаны кириллицей. Нам нужно третье слово.

Помимо букв и цифр у нас могут быть еще важные символы, такие как:

Если мы точно знаем, что искомое слово последнее, мы ставим “$” и результатом работы будет только тот набор символов, после которого идет конец строки.

То же самое с началом строки:

Прежде, чем знакомиться с метасимволами дальше, надо отдельно обсудить символ “^”, потому что он у нас ходит на две работы сразу (это чтобы было интереснее). В некоторых случаях он обозначает начало строки, но в некоторых — отрицание.

Это нужно для тех случаев, когда проще указать символы, которые нас не устраивают, чем те, которые устраивают.

Допустим, мы собрали набор символов, которые нам подходят: “[a-z0-9]” (нас устроит любая маленькая латинская буква или цифра). А теперь предположим, что нас устроит любой символ, кроме этого. Это будет обозначаться вот так: “[^a-z0-9]”.

Выбираем все “не пробелы”.

Итак, вот список основных метасимволов:

Операторы [] и ()

По описанному выше можно было догадаться, что [] используется для группировки нескольких символов вместе. Так мы говорим, что нас устроит любой символ из набора.

Тут мы собрали в группу (между символами []) все латинские буквы и пробел. При помощи <> указали, что нас интересуют вхождения, где минимум 2 символа, чтобы исключить вхождения из пустых пробелов.

Аналогично мы могли бы получить все русские слова, сделав инверсию: “[^A-Za-z\s]<2,>”.

В отличие от [], символы () собирают отмеченные выражения. Их иногда называют “захватом”.

Они нужны для того, чтобы передать выбранный кусок (который, возможно, состоит из нескольких вхождений [] в результат выдачи).

Существует много решений. Пример ниже — это приближенный вариант, который просто покажет возможности регулярных выражений. На самом деле есть RFC, который определяет правильность email. И есть “регулярки” по RFC — вот примеры.

Мы выбираем все, что не пробел (потому что первая часть email может содержать любой набор символов), далее должен идти символ @, далее что угодно, кроме точки и пробела, далее точка, далее любой символ латиницы в нижнем регистре…

Получилось! Но что, если теперь нам надо по отдельности получить домен и имя по email? И как-то использовать дальше в коде? Вот тут нам поможет “захват”. Мы просто выбираем, что нам нужно, и оборачиваем знаками (), как в примере:

В массиве match нулевым элементом всегда идет полное вхождение регулярного выражения. А дальше по очереди идут “захваты”.

В PHP можно именовать “захваты”, используя следующий синтаксис:

Тогда массив матча станет ассоциативным:

Это сразу +100 к читаемости и кода, и регулярки.

Примеры из реальной жизни

Парсим письмо в поисках нового пароля:

Есть письмо с HTML-кодом, надо выдернуть из него новый пароль. Текст может быть либо на английском, либо на русском:

Сначала мы говорим, что текст перед паролем может быть двух вариантов, использовав “или”.
Вариантов можно перечислять сколько угодно:

Далее у нас знак двоеточия и один пробел:

А дальше нас интересует все, что не символ “

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *