Как сделать такой паттерн preg_match?

Нужно сделать паттерн URL, который будет совпадать со следующими адресами:
/page_name.html
/page_name.html/1
/page_name.html/2
....
/page_name.html/999


При этом в matches должно попадать значение page_name и цифры после слеша. Если слеша нет, то во вторую переменную должна попасть пустая строка.

Написал вот такое:
/^\/([\w\-]+)\.html[\/]?([\d]{1,3})?$/


Но оно также реагирует на такой адрес например:
/page_name.html14

Как сделать, чтобы совпадало только если есть слеш и цифра, а если только цифра - то не совпадало?
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
Audiophile
@Audiophile Автор вопроса
Спасибо Stack Overflow

'/^\/([\w-]+)\.html(?|\/(\d{1,3})|())$/'
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@synapse_people
<?php
$arr = array('/page_name.html',
'/page_name.html/1',
'/page_name.html/2',
'/page_name.html/999',
'/page_name.html14',
);

foreach($arr as $a) {

$matches = array();
preg_match('~\\/(?P<page_name>.*?)\.html(?:\\/(?P<num>\\d+))?$~', $a, $matches);
printf("%s => ",$a);

if ($matches) {
	printf(" %s; ", $matches['page_name']);

	if (isset($matches['num'])) {
		printf("[%d]", $matches['num']);
	} else {
		echo "No page set";
	}
} else {
	echo "No matches";
}

echo PHP_EOL;
}

Вывод:
/page_name.html =>  page_name; No page set
/page_name.html/1 =>  page_name; [1]
/page_name.html/2 =>  page_name; [2]
/page_name.html/999 =>  page_name; [999]
/page_name.html14 => No matches
Ответ написан
@dimabdc
/^\/(?P<name>\w+)\.html(\/?(?P<page>\d+))?$/igm
Рекомендую для составления регулярок использовать https://regex101.com/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы