Регулярка для url

Есть такая регулярка

$s = preg_replace('/some\/([^a-z])\/([^0-9])/','some/$1/$2', $this->entered_uri);

Подскажите, как сделать так, чтобы url не мог принимать третий, четвертый и т.п. параметр ? Т.е. только some/$1/$2 и ничего более. Например, если я ввожу в адр. строку:

some/test/test1/test2/test3 - то это и показывает, а нужно только some/test/test1. Остальное отсечь, либо вывести ошибку


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

/some\/([^\/]+)\/([^\/]+).*/

См. пример работы выражения.

Подробности

  • some\/ - строка some/
  • ([^\/]+) - Подмаска №1 ($1): один и более символов, отличных от \/
  • \/ - символ \/
  • ([^\/]+) - Подмаска №2 ($2): один и более символов, отличных от \/
  • .* - ноль и более символов, отличных от символов переноса строки, как можно больше (т.е. оставшаяся часть строки).

Если нужно удалить все нецифровые символы в тексте, захваченным первой подмаской, можно воспользоваться preg_replace_callback:

$this_entered_uri = "some/ads123/test1";
echo preg_replace_callback('/some\/([^\/]+)\/([^\/]+).*/', function($x) {
    return 'some/' . preg_replace('~\D+~', '', $x[1]) . '/' . $x[2];
}, $this_entered_uri);

См. пример работы кода на PHP.

→ Ссылка