2016-07-22 2 views
2

Для практики я создаю свой собственный PHP-маршрутизатор. Этот маршрутизатор может принимать параметры, которые указаны следующим образом:Устранение шаблона параметра без специального символа спереди и сзади

{Я: имяПеременной}

В i обозначает тип параметра (в данном случае целое число) и variableName обозначает VariableName.

Один маршрутизации URI может выглядеть следующим образом:

/дом/{я: идентификатор} - {s: NOVAR}/{м: имяПерем}/{s: someOther}

Я создал следующее регулярное выражение для этой цели:

[^{}]*({((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)})[^{}]* 

для не имеющих 2 параметра рядом друг с другом, и имеющим характер рядом с ним, я расширил регулярное выражение с этой частью:

[^{}]* 

Примером этого является то, что я не буду в состоянии делать такие вещи, как:

/дома/{я: идентификатор} {s: NOVAR}/{м: имяПерем} { s: someOther}

Между ними должны быть символы.

Я думал, что эта часть регулярного выражения будет делать, «Не включать ноль или более из { или } характера.

Когда я запускаю это регулярное выражение по шаблону, как /home/{i:id}{s:noVar}/{m:varName}/{s:someOther}, он по-прежнему получает все параметры, даже те, которые находятся рядом друг с другом.

Как это возможно, и как я могу сделать это так, что регулярное выражение будет извлекать только параметры, которые не рядом друг с другом?

+0

Закройте свой первый шаблон с помощью '(?

+0

@ WiktorStribiżew Что вы имеете в виду? Я все еще новичок в регулярных выражениях. – Bas

+0

Знаете ли вы, что '_-ÿ' создает диапазон? Это ваше намерение? –

ответ

1

Я предлагаю соответствие 2 или более последовательные {...} блокируют и игнорируют те ma и обрабатывать все остальные {...} (несмежные) блоки. С помощью хорошо известного PCRE (*SKIP)(*F) technique:

(?:{(?:[a-zA-Z]:)?[a-zA-Z_]\w*}){2,}(*SKIP)(*F)|{(?:(?<type>[a-zA-Z]):)?(?<name>[a-zA-Z_]\w*)} 

См regex demo

Объяснение:

  • (?:{(?:[a-zA-Z]:)?[a-zA-Z_]\w*}){2,}(*SKIP)(*F) - первая альтернативная ветвь (в 2) в регулярном выражении, что соответствует шаблону (только без групп захвата), которые появляются последовательно, см. {2,}, что означает , совпадение 2 или более случаев на участке. Глаголы (*SKIP)(*FAIL) заставляют двигатель регулярных выражений опустить это совпадение и продолжить.
  • | - или соответствовать тому, что нам нужно:
  • { - открытая {
  • (?:(?<type>[a-zA-Z]):)? - необязательная группа Совмещение ASCII письмо (захватывается в группе "типа") и :
  • (?<name>[a-zA-Z_]\w*) - название группы» "захватив письмо ASCII или _ (см [a-zA-Z_] следуют с 0+ слов символов (от [a-zA-Z0-9_] диапазона)
  • } - закрытие }
+0

Это просто стало намного сложнее, спасибо за объяснение. – Bas

+0

Как только вы поймете, что соответствует шаблону, это будет непросто. –

+0

Сначала были '(? Bas

Смежные вопросы