Некоторые 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+)
Обратите внимание на то, что амперсанд &
в этом шаблоне экранирован. В регулярных выражениях символ &
— это метасимвол, означающий полное соответствие. Поэтому если вы хотите использовать его в качестве литерала (т.е. в качестве реального символа амперсанда), то должны экранировать его.
Чуть более длинный урок по регулярным выражениям | Управление фильтрами |