Регулярное выражение: соответствие параметров маршрута только между косой чертой, но необязательно конечной косой чертой - PullRequest
0 голосов
/ 18 июня 2020

Итак, у меня здесь есть это регулярное выражение:

\/?({[a-zA-Z_0-9]*})\/?

И я хочу, чтобы оно соответствовало этим:

# Valid
/test3/{id}/{test}/{id}

# Valid
/admin/{slug}

# Not Valid
/test3{id}{test}

# Not Valid
/test/{id}/yyy/{dd}/dwdw/{wd}{d}

# Valid
/user/post/{id}

# Valid
/{tt}/{t}

# Valid
/test/{id}/yyy/{dd}////dwdw/{wd}/{d}

Но я хочу, чтобы оно не соответствовало параметрам у которых нет sla sh между ними, например {id}{test}, не должно совпадать.

Как я могу это сделать?

Я установил здесь регулярное выражение: https://regex101.com/r/awUDhM/5

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Просто проверьте, нет ли }{ в строке:

^(?:(?!}{).)+$

Демонстрация и объяснение

php код:

$strs = [
  '/test3/{id}/{test}/{id}',
  '/admin/{slug}',
  '/test3{id}{test}',
  '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
  '/user/post/{id}',
  '/{tt}/{t}',
  '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}',
];
foreach($strs as $str) {
    if (preg_match('/^(?:(?!}{).)+$/', $str)) {
        echo "valid: $str\n";
    } else {
        echo "Not valid: $str\n";
    }
}

Выход:

valid: /test3/{id}/{test}/{id}
valid: /admin/{slug}
Not valid: /test3{id}{test}
Not valid: /test/{id}/yyy/{dd}/dwdw/{wd}{d}
valid: /user/post/{id}
valid: /{tt}/{t}
valid: /test/{id}/yyy/{dd}////dwdw/{wd}/{d}
1 голос
/ 18 июня 2020

Вы можете искать повторяющиеся шаблоны /foo, /{bar} или просто пустой /. Фрагмент кода:

var input = [
  '/test3/{id}/{test}/{id}',
  '/admin/{slug}',
  '/test3{id}{test}',
  '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
  '/user/post/{id}',
  '/{tt}/{t}',
  '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}'
];
input.forEach(function(str) {
  var result = /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/.test(str);
  console.log(str + ' ==> ' + result);
});

Вывод:

/test3/{id}/{test}/{id} ==> true
/admin/{slug} ==> true
/test3{id}{test} ==> false
/test/{id}/yyy/{dd}/dwdw/{wd}{d} ==> false
/user/post/{id} ==> true
/{tt}/{t} ==> true
/test/{id}/yyy/{dd}////dwdw/{wd}/{d} ==> true

Объяснение /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/ regex:

  • ^ - привязка в начале строки
  • (...)+ - одно или несколько случаев того, что находится внутри
  • \/(...|...) - ожидается sla sh, за которым следует логическая группа OR
  • [a-zA-Z0-9]* - первый элемент ИЛИ: только буквенно-цифровые c символы, включая ни одного
  • \{[a-z]+\} - второй элемент ИЛИ: один или несколько символов в нижнем регистре, заключенные в {...}
  • $ - якорь в конце строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...