Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89

Необязательные параметры в URL

01.11.2016, 17:09. Показов 4100. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть функция:
PHP
1
2
3
4
5
6
7
8
    public static function convert_url($pattern){
        $m[] = '#^';
        $m[] = preg_replace_callback('#\{[A-z0-9]+\}#', function($match){
            return '(.+?)';
        }, $pattern);
        $m[] = '/*$#i';
        return join($m, $pieces);
    }
Т.е. заменяет
PHP
1
'/{id}/{id2}' => 'MainPage',
на регулярное выражение. Не знаю как сделать необязательные параметры. Что бы писал что-то вроде {{id}} и параметр был не обязателен.
Дальше идет функция:
PHP
1
2
3
4
5
                if(preg_match($pattern, $this->uri, $matches)){
                    $matches = $this->matches_correct($matches);
                    $this->app = [$iterable_app, ['pattern' => $pattern, 'method' =>$method, 'args' => $matches]];
                    break(2);
                }
Пробовал вместо return '(.+?)'; ставить return '(.*?)'; В этом случае получается необязательным только последний параметр.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2016, 17:09
Ответы с готовыми решениями:

Необязательные параметры
Народ, подскажите, пожалуйста, как в отчёт добавить необязательный параметр? Есть регистр сведений, данные из которого я хочу вывести так...

необязательные параметры функции
Добрый!! Есть такой вот вопросик, применительно к 2008 студии: можно ли задавать необязательные параметры при передаче значений? ...

Необязательные параметры без значения
Добрый день! Хочу написать метод сохранения блока настроек программы в Properties.Settings.Default. Писать метод сохранения каждой...

20
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
02.11.2016, 15:47
Вы только контроллер хотите определять?

А если так?
'/catalog/{id}' => 'ControllerCatalog/showItem' (страница товара)
'/catalog/page/{id}' => 'ControllerCatalog/showPage' (страница каталога товаров)

Для конкретного шаблона URL определяете конкретный метод и контроллер.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.11.2016, 16:20  [ТС]
Вы вообще не поняли о чем я спросил. Я что, так плохо объясняю?!
0
02.11.2016, 16:37

Не по теме:

Vassillissk, я понял ваш вопрос и предложил идти по другому пути. На ваш вопрос не ответил, поскольку не очень хорошо разбираюсь в регулярках.

0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
02.11.2016, 17:17
Цитата Сообщение от Vassillissk Посмотреть сообщение
Я что, так плохо объясняю?!
как любой велосипедист - двух слов связать не можете. В массиве $_POST есть все параметры. Или объясняйте устройство своего велосипеда
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.11.2016, 17:21  [ТС]
У меня подключаются модули, а не контроллеры. Мне нужно сделать выражение такое, что бы было на подобии (.+?), но при этом шаблон был не обязателен. Я плохо понимаю выражения (
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.11.2016, 17:30
Цитата Сообщение от Vassillissk Посмотреть сообщение
на регулярное выражение
че религия не позволяет сразу писать регулярное выражение?
зачем этот костыль с заменой
пример простого роутинга на php7 Доработка чужих проектов
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.11.2016, 17:55  [ТС]
Во многих фреймворках так. Да и не суть, это не имеет значение в данном случае.

Добавлено через 18 минут
У меня получается так: #^(.+?)/*$#i при этом все параметры получаются обязательными. Если поставить так: #^(.*?)/*$#i то получается все обязательными, кроме последнего. Как сделать? Не надо было лишний год писать.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.11.2016, 18:12
внутри скобок ? отвечает за жадность
за скобками #^(.*)?/$ знак вопроса говорит, то что в скобках не обязательно
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.11.2016, 18:32  [ТС]
Попробовал так:
#^(.*?)(.*?)/*$#i обязателен
#^(.*?)?(.*?)?/*$#i обязателен
#^(.*)?(.*)?/*$#i обязателен
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.11.2016, 18:51
PHP
1
2
3
var_dump(preg_match('#^(.*?)(.*?)/*$#i', '')); //1
var_dump(preg_match('#^(.*?)?(.*?)?/*$#i', '')); //1
var_dump(preg_match('#^(.*)?(.*)?/*$#i', '')); //1
что-то не то делаете так как пустая строка проходит проверку во всех ваших вариантах
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
02.11.2016, 18:54
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
че религия не позволяет сразу писать регулярное выражение?
Потому что проще написать {id} и один раз задать регулярное выражение для всех этих тегов, которое потом можно будет быстро изменить, чем потом сто штук менять. И маршруты гораздо понятнее и поддерживать проще.

P.S. Только Вы не ругайтесь, а-то у меня настроение ухудшается и тоже начинаю ругаться.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.11.2016, 19:20
Цитата Сообщение от Para bellum Посмотреть сообщение
Потому что проще написать {id}
нет это тормоз еще один, программист должен знать регулярные выражения,
маршруты не пишутся тысячами, так как это будет напоминать кашу, и говорить о неправильной структуре приложений
{id} или (\d+) жесть, не стоит ориентироватся на фреймворки, они написаны на все случаи жизни и соответсвенно для всех тормозов
а здесь вы просто еще раз пробегаетесь регуляркой по строке чтобы вернуть еще раз строку
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
02.11.2016, 19:40
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
маршруты не пишутся тысячами
Тысячами не пишутся, но и не один, если сайт не одностраничный. Можно, конечно, RESTful контроллеры для сокращения файла маршрутизации использовать.
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
фреймворки, они написаны на все случаи жизни и соответсвенно для всех тормозов
Как раз маршрутизация "всех случаев жизни" не касается -- web-адреса одни для всех и ничего нового Вы туда не впишите.

Ладно, всё это настолько мелко, что нервов совершенно не заслуживает.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
03.11.2016, 03:52  [ТС]
Передано 2 аргумента, найдено совпадение, аргументы записываются в массив
HTML5
1
2
3
#^/(.*?)/(.*?)/*$#i
/p/3
Array ( [0] => /p/3 [1] => p [2] => 3 )
Передан 1 аргумент, совпадения нет
HTML5
1
2
#^/(.*?)/(.*?)/*$#i
/p
HTML5
1
2
#^/(.*?)?/(.*?)?/*$#i
/p
Вот функция на всякий случай:
PHP
1
2
3
4
5
                if(preg_match($pattern, $this->uri, $matches)){
                    $matches = $this->matches_correct($matches);
                    $this->app = [$iterable_app, ['pattern' => $pattern, 'method' =>$method, 'args' => $matches]];
                    break(2);
                }
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
03.11.2016, 04:22
PHP
1
2
3
4
preg_match('#^/(.+)(?:/)?([^/].*)?$#iU', '/p/3', $match); 
var_dump($match);
preg_match('#^/(.+)(?:/)?([^/].*)?$#iU', '/p', $match); 
var_dump($match);
Результат
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(3) {
  [0]=>
  string(4) "/p/3"
  [1]=>
  string(1) "p"
  [2]=>
  string(1) "3"
}
array(2) {
  [0]=>
  string(2) "/p"
  [1]=>
  string(1) "p"
}
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
03.11.2016, 23:01  [ТС]
HTML5
1
2
3
4
5
6
Что-то много изменений...
'#^/ - начало строки
(.+) - обязательный параметр
(?:/)? - не понял
([^/].*)? - вообще не понял
$#iU' -конец строки
0
276 / 201 / 143
Регистрация: 22.01.2016
Сообщений: 637
04.11.2016, 00:40
Цитата Сообщение от Vassillissk Посмотреть сообщение
(?:/)? - не понял
либо один /, либо ни одного
Цитата Сообщение от Vassillissk Посмотреть сообщение
([^/].*)? - вообще не понял
первый символ всё кроме /, затем любые символы любой длины. выражение может встретиться 0-1 раз
Цитата Сообщение от Vassillissk Посмотреть сообщение
$#iU' -конец строки
ещё i - регистронезависимый поиск, U - не жадный поиск
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
04.11.2016, 00:42
PHP
1
2
$params = array_filter(explode('/', '/p/3'));
var_dump($params);
сбиваете своими регулярками с толку
2 ^ - один символ галочка вверх это начало строки
4 пассивная группа(не обязательно), результат не попадает в выборку
5 галочка вначале квадратных скобок - отрицание символа
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
04.11.2016, 02:31  [ТС]
Не понимаю.
Нашло, распределило.

Не нашло совпадений, функция не выполнена
Название: Снимок2.PNG
Просмотров: 15

Размер: 25.0 Кб
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2016, 02:31
Помогаю со студенческими работами здесь

Есть ли в Java необязательные аргументы/параметры по умолчанию
Всем привет! Java тока учу, подскажите, пожалуйста, есть ли в Java необязательные аргументы, ну т.е. те, которые можно как-то обозначить в...

Необязательные параметры (значения по умолчанию) методов класса
Коллеги, добрый день. Учусь, потому прошу не судить строго. Сразу отмечу, что подобный вопрос задал, продолжая диалог в ветке, но...

Алгоритм проверки для функции, имеющей необязательные параметры
Добрый день! В случае отсутствия или передачи из 3-х необязательных аргументов 2-х, 3-х или 1 по выбору пользователя, являющимся...

Как скрыть параметры URL и передать их методом пост используя Url.Action()
Здравствуйте. У меня в представлении на сайте есть ссылка, которая формируется в методе действии контроллера MyView1 с помощью...

Необязательные параметры и params - как в params ввести несколько аргументов
Интересует такой вопрос, если у меня есть набор необязательных параметров в методе, для примера: static void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru