Регулярные выражения на PHP

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
pessimist
Сообщения: 47
Благодарил (а): 55 раз
Поблагодарили: 6 раз

Регулярные выражения на PHP

Сообщение pessimist » Вт окт 04, 2016 7:27 pm

Сам по себе язык веб-программирования PHP создавался для работы с веб страницами. Поэтому этот язык содержит очень удобные функции для работы с содержимым HTML документа.
О некоторых из таких удобных функций я и собрался порассуждать в этой теме.

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

Синтаксис функции file_get_contents:

Код: Выделить всё

file_get_contents('адрес_сайта_или_имя_файла');

Теперь передадим этой функции в работу некоторую веб страницу для примера, которая находится по адресу:http://tdapiter.ru/prima.html и вызов функции будет выглядеть так:

Код: Выделить всё

file_get_contents('http://tdapiter.ru/prima.html');

В результате своей работы функция file_get_contents или вернет содержимое веб страницы или вернет FALSE, если получить содержимое по каким-либо причинам произвести не удалось.
Содержимое, которое file_get_contents вытянула из вебстраницы, следует сохранить в переменной, в результате пример примет вид:

Код: Выделить всё

$text_html = file_get_contents('http://tdapiter.ru/prima.html');

И вот тут начинается самое интересное. Требуется полученную вебстраницу "распотрошить", то есть выбрать в тексте страницы определенные слова или HTML теги. Зачем? Ну не знаю, цели могут быть разные. Например, требуется подсчитать сколько раз в тексте веб страницы встречается слово "акции".

Итак, функция preg_match_all работает с тремя параметрами:
  1. Что искать?
  2. Где искать?
  3. Куда складывать найденное.
Первый параметр, который я назвал "Что искать" представляет собой регулярное выражение. Регулярное выражение это строка, которая содержит в себе специальные управляющие символы. Для того, чтобы интерпретатор PHP понял, что имеет дело не с обычной строкой, а с регулярным выражением - в строку, которая заключается в одинарные кавычки 'строка', добавляются дополнительные "скобки" состоящие из пары одинаковых символов. То есть синтаксис регулярного выражения в общем виде выглядит так: '/регулярное_выражение/'.

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

Одинарные кавычки:

Код: Выделить всё

$test = 13245;
echo 'вот такой ответ: $test';

Результатом выполнения данного кода будет вывод на экран имени переменной: вот такой ответ: $test.
Двойные кавычки:

Код: Выделить всё

$test = 13245;
echo "вот такой ответ: $test";

Результатом выполнения данного кода будет вывод на экран содержимого переменной: вот такой ответ: 13245.

Но вернемся к регулярным выражениям в одинарных кавычках. Здесь следует отметить один очень важный момент. Символ, который обозначает дополнительные скобки, может быть управляющим символом, который захочется применить в регулярном выражении. Для того, чтобы интерпретатор PHP четко понимал, что есть скобки, а что есть управляющий символ создано правило. Если символ обозначает скобки, то использовать его в качестве управляющего в регулярном выражении нельзя. Как быть? Предлагается следующее решение: скобки регулярного выражения допускается обозначать различными парами символов, при этом, такие символы не должны включаться в регулярное выражение в качестве управляющих. На принципах работы регулярного выражения и его составления с использованием управляющих символов я остановлюсь подробнее несколько ниже по тексту.

Второй параметр - это строка или текстовый файл (а веб страница на HTML или PHP представляет собой именно текстовый файл) в котором разыскивается некоторый участок текста в соответствии с заданным регулярным выражением.

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

Но вернемся к описанию и разбору составления регулярных выражений. Без использования специальных управляющих символов, все алфавитно-цифровые символы обозначают в регулярном выражении сами себя. Пусть в качестве учебной задачи следует найти в тексте по адресу http://tdapiter.ru/prima.html все вхождения слова "акции".

Для решения учебной задачи подойдет следующий код:

Код: Выделить всё

<?php
header
('Content-Type: text/html; charset=utf-8');
$text_html = file_get_contents('http://tdapiter.ru/prima.html'); 
preg_match_all
('/акции/', $text_html, $karman);

На следующей картинке приведен пример вызова функции preg_match_all с описанием смысла каждого параметра.
Описание кода с использованием простейшего регулярного выражения - Risunok_1.png
Описание кода с использованием простейшего регулярного выражения

После выполнения кода из примера все найденные вхождения соответствующие слову "акции" разместятся в двумерном массиве $karman. Двумерный массив наглядно представить в виде обыкновенной таблицы. Каждая ячейка является принадлежностью ряда и колонки. Ячейка - соответствует одному элементу первого измерения массива. Номер колонки является для него индексом первого измерения. Ряд содержит в себе несколько ячеек и номер ряда соответствует индексу второго измерения. На рисунке ниже представлено последовательное заполнение массива $karman функцией preg_match_all:
Иллюстрация процесса выборки слов по шаблону и размещение их в массиве - Risunok_2.png
Иллюстрация процесса выборки слов по шаблону и размещение их в массиве

Строго говоря, в PHP массив не является такой таблицей, а представляет собой связанный список. Ряд в двумерном массиве PHP является отдельным элементом. Поэтому в массиве семь заполненных ячеек словом "акции", но восемь элементов. Это важно понимать, если мы хотим узнать сколько раз встречается в тексте слово "акции". Узнать число элементов массива можно с помощью функции count();. Но мы знаем, что один элемент массива содержит в себе ряд, поэтому его следует вычесть из общего числа элементов. Выполнение кода echo count($karman)-1; позволит нам узнать сколько раз функция preg_match_all нашла слово "акции" в заданном тексте.

Изучение регулярных выражений на PHP продолжу в следующих постах.
Реклама

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость