Необязательное совпадение после запятой в регулярном выражении - PullRequest
0 голосов
/ 17 октября 2011

Я так старался и так далеко, но в итоге это не сработало !!

Я бы хотел добиться следующего: У меня есть функция preg_replace_callback, где я хочу обратиться к своей функции «словаря».

Я использую свой собственный тег "словарь":

<[general,username]>
<[general,username,1]>

это должно вызвать мою функцию "словарь". Функция с ее аргументами: dictionary($search,$section,$upper=null)

$search = filename
$section = array key
$upper = (int) 1 to 3

Моя функция обратного вызова вызывает функцию со значениями из тегов словаря.

for <[general,username]> I need
- $search = general
- $section = username
- $upper = null

but for <[general,username,1]> I want
- $search = general
- $section = username
- $upper = 1

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

Мое регулярное выражение:

/\<\[([^\[]+)\,([^\[]+)(\,[0-2])?\]\>/

но это не работает правильно. Я получаю следующие результаты:

для <[general, username]> я получаю

[0] => <[general,username]>
[1] => general
[2] => username

для <[general, username, 1]> я получаю

[0] => <[general,username,1]>
[1] => general,username
[2] => 1

но я бы хотел

[0] => <[general,username,1]>
[1] => general
[2] => username
[3] => 1

Что я делаю не так ??

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

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

/\<\[([^\[,]+)\,([^\[,]+)(?:\,([0-2]))?\]\>/
1 голос
/ 17 октября 2011

Исключить запятую из диапазона второй группы ....

Или, если предположить, что первые 2 термина являются буквенно-цифровыми:

\<\[(\w+)\,(\w+)\,?(\d+)?\]\>
1 голос
/ 17 октября 2011

Попробуйте это:

/\<\[([^\,]+)\,([^\,]+)(?:\,(\d+))?\]\>/
 - Item[0] => whole matching text
 - Item[1] => general
 - Item[2] => username
 - Item[3] => upper (if match)
...