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

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

01.11.2016, 17:09. Показов 2668. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 17:09
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Не по теме:

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

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

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

P.S. Только Вы не ругайтесь, а-то у меня настроение ухудшается и тоже начинаю ругаться.
0
Эксперт PHP
933 / 691 / 235
Регистрация: 01.02.2015
Сообщений: 1,848
02.11.2016, 19:20 13
Цитата Сообщение от Para bellum Посмотреть сообщение
Потому что проще написать {id}
нет это тормоз еще один, программист должен знать регулярные выражения,
маршруты не пишутся тысячами, так как это будет напоминать кашу, и говорить о неправильной структуре приложений
{id} или (\d+) жесть, не стоит ориентироватся на фреймворки, они написаны на все случаи жизни и соответсвенно для всех тормозов
а здесь вы просто еще раз пробегаетесь регуляркой по строке чтобы вернуть еще раз строку
0
Эксперт PHP
5164 / 3805 / 1330
Регистрация: 06.01.2011
Сообщений: 10,561
02.11.2016, 19:40 14
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
маршруты не пишутся тысячами
Тысячами не пишутся, но и не один, если сайт не одностраничный. Можно, конечно, RESTful контроллеры для сокращения файла маршрутизации использовать.
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
фреймворки, они написаны на все случаи жизни и соответсвенно для всех тормозов
Как раз маршрутизация "всех случаев жизни" не касается -- web-адреса одни для всех и ничего нового Вы туда не впишите.

Ладно, всё это настолько мелко, что нервов совершенно не заслуживает.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
03.11.2016, 03:52  [ТС] 15
Передано 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
933 / 691 / 235
Регистрация: 01.02.2015
Сообщений: 1,848
03.11.2016, 04:22 16
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  [ТС] 17
HTML5
1
2
3
4
5
6
Что-то много изменений...
'#^/ - начало строки
(.+) - обязательный параметр
(?:/)? - не понял
([^/].*)? - вообще не понял
$#iU' -конец строки
0
276 / 201 / 143
Регистрация: 22.01.2016
Сообщений: 637
04.11.2016, 00:40 18
Цитата Сообщение от Vassillissk Посмотреть сообщение
(?:/)? - не понял
либо один /, либо ни одного
Цитата Сообщение от Vassillissk Посмотреть сообщение
([^/].*)? - вообще не понял
первый символ всё кроме /, затем любые символы любой длины. выражение может встретиться 0-1 раз
Цитата Сообщение от Vassillissk Посмотреть сообщение
$#iU' -конец строки
ещё i - регистронезависимый поиск, U - не жадный поиск
0
Эксперт PHP
933 / 691 / 235
Регистрация: 01.02.2015
Сообщений: 1,848
04.11.2016, 00:42 19
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  [ТС] 20
Не понимаю.
Нашло, распределило.
Необязательные параметры в URL

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

Размер: 25.0 Кб
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2016, 02:31

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru