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

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

01.11.2016, 17:09. Показов 4098. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru