Материал предоставлен https://it.rfei.ru

Поиск соответствия для пары "имя переменной/значение"

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

http://www.example.com/catalogue/index.php?ItemID=4963

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

Надо сделать так, чтобы в результатах Google Analytics отображалось не бессмысленное число, а что-то более осмысленное и понятное для среднестатистического человека.

Сначала надо создать обобщенное регулярное выражение для пары “имя/значение”. В этой паре имя может состоять из букв и цифр, но оно всегда должно начинаться с буквы. Значение для данного примера всегда будет числом, состоящим из четырех цифр. Имена и значения в URL-адресах всегда разделяются знаком равенства =. В данном примере в URL-адресах сайта никогда не бывает больше одной переменной. Можно использовать экранирующие последовательности (или escape-последовательности), где это возможно, — это сделает регулярное выражение более удобочитаемым.

Нужно, чтобы первым символом была буква. Можно обозначить эту букву [a-z]. Поскольку вначале может идти одна или несколько букв, нужно добавить также знак “плюс” +:

[a-z]+

Остальная часть имени — это буквы либо цифры. Можно написать это в виде [a-z0-9] либо использовать знак экранирования и написать \w, что означает “любой словесный символ”, т.е. символ, использующийся в словах. Обычно это все буквы, все цифры и знак подчеркивания.

Теперь, чтобы разрешить, но не потребовать, чтобы было включено число, нужно использовать звездочку *, а не знак “плюс” +. Только ни в коем случае не вставляйте пробел между символами внутри квадратных скобок.

[a-z]+\w*

Это имя переменной. После имени переменной всегда стоит знак равенства =:

[a-z]+\w*=

В данном примере значение всегда будет числом, состоящим из четырех цифр. Это можно выразить разными способами. Вы можете, если хотите, повторить фрагмент [0123456789] четыре раза, но это будет очень длинно. Можно написать также [0-9] [0-9] [0-9] [0-9], но это все равно длинно. Если вам нравятся экранирующие последовательности, можно записать четыре цифры в виде \d\d\d\d (обратите внимание на то, что здесь не нужны квадратные скобки).

Можно написать \d{4}, что означает “цифра, ровно четыре раза”. Теперь, если требуется зафиксировать это число из четырех цифр для дальнейшего использования, выражение нужно поместить в круглые скобки ( ). Для ясности будет использоваться запись \d\d\d\d:

[a-z]+\w*=(\d\d\d\d)

В том, чтобы уметь сравнить любую пару “имя/значение”, смысла немного. При создании фильтров нужно уметь сравнивать особые пары. Поэтому надо заменить этот обобщенный шаблон для имени переменной на литеральный, который используется в примере URL-адреса:

ItemID=(\d\d\d\d)

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

ItemID=(\d+)

Данное регулярное выражение будет соответствовать только цифрам. Запись \d не будет соответствовать символу &, который разделяет пары переменных. И это значит, что фильтр либо достигнет конца URL-адреса, либо там будет амперсанд, и поиск соответствия завершится. И если в каталоге будет более 9 999 элементов, то фильтр не перестанет работать, когда обнаружит ItemID=10000 (пять цифр).

Но что если нужно иметь возможность использовать в значениях буквы и цифры? Это наверняка понадобится, если вы захотите определить длинный и сложный идентификатор сеанса. Помните, что \w* означает буквы и цифры (точнее, текстовые символы). В данном случае не нужно будет, чтобы первой шла буква. Поэтому вместо * можно поставить +:

ItemID=\w+

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

http://www.example.com/index.php?CatID=1A&ItemID=4309

Чтобы найти соответствие для этих двух переменных отдельно, нужно использовать два отдельных регулярных выражения:

CatID=(\w*)

ItemID=(\d+)

А чтобы найти соответствие для них вместе, нужно выполнить конкатенацию (этот термин означает “объединить вместе”):

CatID=([\w]*)\&ItemID=(\d+)

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

Чуть более длинный урок по регулярным выражениямУправление фильтрами