Лекция
Привет, Вы узнаете о том , что такое регулярные выражения в php , Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое регулярные выражения в php , регулярные выражения, поиск с инверсией , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .
Понадобилось мне найти все слова в предложении, кроме определенных слов. Например, в предложении ‘Many modern computing systems provide wildcard characters in matching filenames from a file system.‘ найти все, кроме слов computing и matching.
Испытуемый текст: ‘Many modern computing systems provide wildcard characters in matching filenames from a file system.‘
Регулярное выражение: ‘/\\b(?!(?:computing|matching)\\b)w+\\b/’
Результат: перечень всех слов за исключением computing и matching.
где,
\\b – граница слова
w – набор символов [A-Za-z0-9_]
?: – несохраняющие скобки, т.е. все что внутри группирующих скобок не будет включено в результат
?! – поиск с инверсией , т.е. то, что внутри будет исключено из совпадения
Вообще комбинация ?! называется негативная опережающая проверка и относится к одному из четырех видов позиционных проверок:
Тип | Регулярное выражение |
Успешна, если подвыражение… |
---|---|---|
Позитивная ретроспективная проверка | (?<=..) | Может совпасть слева |
Негативная ретроспективная проверка | (?<!–..) | Не может совпасть слева |
Позитивная опережающая проверка | (?=..) | Может совпасть справа |
Негативная опережающая проверка | (?!..) | Не может совпасть справа |
Для проверки работы можно воспользоваться:
Расширение для FireFox Regular Expressions Tester
Полезный материл – RegexAdvice Forums – форум по регулярным выражениям.
Пока читал бестлер про регулярным выражениям – Дж. Фридл – регулярные выражения узнал две интересные вещи:
BRE (basic regular expressions) – базовые регулярные выражения
ERE (extened regular expressions) – расширенные регулярные выражения
НКА (недетерминированный конечный автомат) – механизм управляется регулярным выражением
ДКА (детерминированный конечный автомат) – механизм управляется текстом
Поддержка диалектами разных метасимволов
Метасимволы | BRE | ERE |
---|---|---|
Точка, ^, $, [..], [^..] | ||
Произвольное число | * | * |
Квантификаторы + и ? | +? | |
Интервальный квантификатор | {мин, макс} | {мин, макс} |
Группировка | (..) | (..) |
Применение квантификаторов к скобкам | ||
Обратные ссылки | 1..9 | |
Конструкция выбора |
Краткая таблица сравнения ДКА и НКА
параметры | ДКА | НКА |
---|---|---|
поддержка обратных ссылок | ||
сохранение текста в круглых скобках | ||
быстрый поиск совпадений | ||
быстрая компиляция | ||
меньшие затраты памяти |
Примечание редакции. Об этом говорит сайт https://intellect.icu . Существует много диалектов языка регулярных выражений. Выражения из этой статьи используют синтаксис, принятый в Perl, в том числе недоступные в других диалектах функции. Похожий диалект вне языка Perl известен как "Perl-совместимые регулярные выражения" (PCRE, Perl-Compatible Regular Expressions).
В большинстве текстовых редакторов можно провести поиск по слову, его части и учитывать регистр. Чаще всего, этих возможностей достаточно, поскольку приходится обрабатывать относительно простые тексты - мозг человека сразу оценивает полученное совпадение и принимает решения.
Рано или поздно наступает момент, когда человеческих ресурсов не хватает для обработки всей поступающей информации, или требуется ввести полностью автоматизированную обработку данных, например, для публикации новостей из разных источников на своем сайте. Здесь вступают в работу автоматизированные системы, в которых нашли широкое применение регулярные выражения. Их использование позволяет в десятки раз уменьшить объем кода, необходимого для обработки текстов. При первом знакомстве регулярные выражения вызывают самые различные реакции, но общее в них то, что человека отталкивает сложность понимания смысла этих «высказываний». Данная статья призвана объяснить, как прочитать выражение и понять его смысл.
Термины
Словарь операторов
Так выглядит перевод конструкций регулярных выражений на «человеческий» язык. В дальнейшем, при разборе примеров, я дам им развернутое описание.
Чтение и написание регулярных выражений
Проговаривание вслух и запись правил - основная проблема, возникающая при освоении техники разбора текста с помощью регулярных выражений. При отсутствии опыта трудно сформулировать словесную запись правил. Тем не менее - это наиболее эффективный путь составления регулярных выражений.
Основным правилом при составлении регулярных выражений является их запись в развернутом виде на листе бумаги или на экране. Так легче всего определить, насколько верно будет обработан текст. Другое правило заключается в составлении выражения от общего к частному. При его соблюдении значительно сокращается время написания выражения и количество ошибок.
Сформулируем условия для успешного составления регулярного выражения
Несмотря на трудоемкость подобной записи, она повышает скорость разработки и отладки правил разбора текстов и эффективность их применения.
Пример составления выражения
Задача
Выделить в HTML разметке содержимое определенных блоков с установленными атрибутами:
<p>Абзац 1</p> <p class="content">Абзац 2</p> <ul> <li>Элемент 1</li> <li class="content">Элемент 2</li> </ul>
<p class="content">Абзац 2</p> <li class="content">Элемент 2</li>
Последовательность решения
Обычно начинают одновременно производить все 6 шагов что вызывает серьезные проблемы при отладке. Я предлагаю действовать постепенно. Шаг за шагом.
Приведу решение сразу:
#<(p|li)\s+[^>]*?class\s*=\s*(['"])content\2[^>]*>((?:(?!</\1>).)*)</\1>#is
Согласитесь, выглядит оно почище «китайской грамоты». Тем не менее, следуя описанию, Вы увидите, что все не так уж и сложно.
Итак, начнем:
Шаг 1. Выделение всех тегов
Запишем правила разбора по-русски:
Теперь, когда задача точно описана, можно приступить к записи ее в виде регулярного выражения:
У нас получилось следующее выражение:
<(\w+)[^>]*>([^<]*)
Оно имеет 2 недостатка:
Шаг 2. Выделение парных тегов
Запишем правила разбора формальным языком:
Теперь, когда задача точно описана, можно приступить к записи ее в виде регулярного выражения:
Итак, у нас получилось следующее выражение:
<(\w+)[^>]*>((?:(?!</\1>).)*))</\1>
Оно захватывает любые парные теги вместе с содержимым.
Шаг 3. Выделение требуемых тегов
Используя регулярное выражение, полученное на предыдущем шаге, мы можем выделить из текста сразу несколько типов тегов, используя конструкцию «альтернативная последовательность при отсутствии совпадения слева». В описании используем термин «альтернативная последовательность».
Добавим выделение из текста всего содержимого абзацев и пунктов списка:
Пункты 7 и 8 были добавлены для того, чтобы выражение не захватывало теги, начало которых совпадает с выделяемыми тегами. Например, чтобы при поиске тега <p> не были захвачены теги <param>.
Переводим ее в операторы регулярного выражения:
Новое регулярное выражение:
<(p|li)(?=[\s>])[^>\w]*>((?:(?!</\1>).)*))</\1>
Теперь в тексте будут выделены только теги p и li и все их содержимое.
Шаг 4. Выделение пар имя_атрибута = "значение"
Требования к выражению
Опишем задачу формальным языком:
Переводим в операторы регулярного выражения:
Получается следующее регулярное выражение:
\s+\w+\s*=\s*(['"])[^\1]*\1
Модифицируем его, чтобы выражение совпадало только с именем атрибута 'class' и его значением 'content':
\s+class\s*=\s*(['"])content\1
Шаг 5. Добавим в основное выражение проверку на определенные атрибуты
Опишем задачу формальным языком:
Переводим ее в операторы регулярного выражения:
Результирующее выражение:
<(p|li)\s+[^>]*?class\s*=\s*(['"])content\2[^>]*>((?:(?!</\1>).)*)</\1>
Шаг 6. Добавление модификаторов и ограничителей
Ограничители
Практически во всех языках, где имеется поддержка регулярных выражений, возможно выбрать ограничители выражения. Самые распространенные это: / / и # #. В принципе, можно использовать практически любые пары символов, если это поддерживается интерпретатором. При выборе ограничителей лучше исходить из того, какие символы присутствуют в регулярном выражении. Выбирать лучше те, которых в выражении нет. В противном случае придется экранировать эти символы, что сделает выражение более запутанным. В нашем случае стандартные / / не подходят, поскольку они есть внутри регулярного выражения. Поэтому я предлагаю использовать ограничители # #.
Модификаторы
Информацию по всем модификаторам поиска я советую смотреть в специальной справочной литературе, например, в документации по PHP и Perl. Здесь же мы используем i - поиск без учета регистра и s - режим совпадения символа «.» с переводами строк.
Финальное выражение
#<(p|li)\s+[^>]*?class\s*=\s*(['"])content\2[^>]*>((?:(?!</\1>).)*)</\1>#is
Как видите, эта задача решается достаточно просто. При написании статьи я ее выбрал потому, что на форумах очень часто задают вопрос «как выбрать содержимое определенного тега» и «как разобрать HTML разметку». Решение перед вами.
Полезные ссылки
Анализ данных, представленных в статье про регулярные выражения в php , подтверждает эффективность применения современных технологий для обеспечения инновационного развития и улучшения качества жизни в различных сферах. Надеюсь, что теперь ты понял что такое регулярные выражения в php , регулярные выражения, поиск с инверсией и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Определения специальных символов для регулярных выражений
Цитировать следующий метасимвол
^ Соответствие началу строки
. Соответствует любому символу (кроме новой строки)
$ Соответствует концу строки (или перед новой строкой в конце)
| альтернативность
() Группировка
Класс персонажа
Соответствие 0 или более раз
+ Соответствие 1 или более раз
? Совпадение 1 или 0 раз
n соответствует ровно n раз
n, Соответствовать не менее n раз
n, m Совпадение не менее n, но не более m раз
Больше специальных персонажей
t символ табуляции (HT, TAB)
n перевод строки (LF, NL)
r возврат строки (CR)
f подача формы (FF)
a будильник (звонок) (БЕЛ)
e escape(думаю, troff) (ESC)
033 восьмеричный символ (вспомним PDP-11)
x1B шестнадцатеричный символ
c контрольный символ
l строчный следующий символ (думаю, vi)
u следующий символ в верхнем регистре (думаю, vi)
L строчными до E (думаю, vi)
U прописными до E (думаю, vi)
E конец модификации (думаю, vi)
Q Цитировать (отключить) метасимволы шаблона до E
Еще больше специальных символов
w Соответствует символу «слово (буквенно-цифровой и «_ )
W Соответствует несловесному символу
s Соответствует пробелу
S Соответствует непробельному символу
d Совпадение с цифрой
D Соответствует нецифровому символу
b Соответствует границе слова
B Сопоставить не- (граница слова)
A совпадать только в начале строки
Z Совпадение только в конце строки или до новой строки в конце
z Совпадение только в конце строки
G Соответствует только там, где предыдущий m//g остановлен (работает только с/g)
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)