Всем привет, Хочу сделать проверку, наверное простая и я сам мог бы сделать ее, но голова сейчас просто не варит. Проверка заключается в следующем: Например я принял значения со силки $link = "/logo/fer43-sdf23-df22/logo" Мне нужно, чтобы если эта ccылка выглядит так PHP: /logo/hash/logo (например /logo/fer43-sdf23-df22/logo) или /hash/logo (например /fer43-sdf23-df22/logo) или /logo/hash (например /logo/fer43-sdf23-df22) или /hash (например /fer43-sdf23-df22) тогда выводило например ОК! а если ccылка не имеет такого вида тогда WRONG LINK! Помогите мне пожалуйста и еще чтобы например в переменную $hash записывалось значение хэша. В данном случае $hash должен равняться fer43-sdf23-df22
Можешь написать подробнее, что ты вообще хочешь сделать? Ты хочешь сделать чпу ? Ты об одной точке входа слышал?
Да, это и есть 1 точка входа, в файле я принимаю ссылку и в соответствии с ней формируется контент. Сейчас мне нужно сделать проверку, чтобы если ссылка выглядит так кая я описывал выше тогда выводило OK !, а если нет тогда WRONG LINK! (Позже я заменю это на нужные данные) Можешь помочь с этим?
Покажи мне свой роутер... И как ты маршрутизируешь ссылки. P.S Ты случаем не хочешь проверять ручками, каждую входящую ссылку на валидность?
В общем, есть трекер voluum он формирует ссылки с помощью которых помогает анализировать трафик. То есть в системе генерируется ссылка и при клике на нее перенаправляет на страницу с которой считываются данные такие как браузер с которого зашли, страна, устройство и так далее, после чего перенаправляет на сайт, который прикреплен к этой силки. Я хочу сделать подобную систему но с меньшим функционалом. Сейчас мне нужно собственноручно сделать такую ссылку как и у voluum, чтобы лучше понимать работу системы которую я буду позже создавать. Чтобы было понятнее, для примера я сделал ссылку в voluum http://z3txt.voluumtrk.com/85ce5ccc-24fe-4716-8c6b-17295096725e она работает и в таком виде http://z3txt.voluumtrk.com/voluum/85ce5ccc-24fe-4716-8c6b-17295096725e и в таком http://z3txt.voluumtrk.com/85ce5ccc-24fe-4716-8c6b-17295096725e/voluum/ и в таком http://z3txt.voluumtrk.com/voluum/85ce5ccc-24fe-4716-8c6b-17295096725e/voluum/ (Я хочу чтобы моя ссылка работала так же) эта ссылка ведет на страницу, где собирает данные, затем сразу перенаправляет в Google. Так вот как мне сделать проверку, чтобы и моя ccылка могла проходить в таком виде как и в voluum? P.S Конечно я не хочу проверять все вручную, мне нужна универсальная проверка
Ты что нибудь уже написал? Вообще ты организовал уже единую точку входа, и сам движок и логику работы сделал? Если да то показывай мне свой роутер, и тот файл где ты выставляешь маршруты. --- Добавлено --- Тут нужно отталкиватьcя от того как ты реализовал маршрутизацию ссылок. И вообще логику ед. входа на страницу. --- Добавлено --- Вот например у меня в движке есть класс, который отвечает за маршрутизацию ссылок. Я делаю запрос к БД, получаю уникальный id. и те данные которые мне нужны, дальше создаю экземпляр класса маршрутов, и добавляю в него уник id как ссылку, и уже дальше делаю дальше эту проверку что если тек ссылка равна значению из id то всё гуд конфигурируем страницу с нужными параметрами, если нет говорю пошёл нахер такой страницы нет. --- Добавлено --- можешь id поставить разделителем твоя ссылка и после неё знак ? и дальше эксплодом по вопросу разбей и получешь последнию часть ссылки, а дальше уже сравнивай с id твоим или с чем ты там сравниваешь. И говори если всё хорошо то делай то что надо если нет, то говоришь извините, но мимо. --- Добавлено --- Пример разбивания ссылки PHP: $link = 'http://ТвояСсылка.ru/ТвойМаршрут/ПофигКакойДлины/ХотьТамдоусрачки/ЕслиТыконечно/ВсёПравильноВСвоёмРоутереНастроил/ТутТвойVoloom?id'; //$_SERVER['REQUEST_URL'] - Получение тек url $result = explode('?',trim($link)); $id = 'Твой_ID'; if ($result[1] == $id) { //Тут уже делай то что тебе нужно } else { // Иначе перенаправляй на страницу которая будет сообщать, что такой страницы нету } --- Добавлено --- PHP: basename($_SERVER['REQUEST_URI']) Ещё можно так получить последний элемент url --- Добавлено --- Можешь ещё разбить url и получить из него массив. Посмотри функцию PHP: parse_url() ; https://php.ru/manual/function.parse-url.html
Хорошо, давайте так Предположим что есть такой код Код (Text): $String1 = "/company/fer43-sdf23-df22/ company/"; $String2 = "/some_text/fer43-sdf23-df22"; $String3 = "/company/fer43-sdf23-df22"; $String4 = "/fer43-sdf23-df22"; $String5 = "/fer43-sdf23-df22/some_text/"; $String6 = "/fer43-sdf23-df22/company/"; $String7 = "/sdf/company/fsd/fer43-sdf23-df22/sdfgsd"; $logo = "company"; ПРОВЕРКА, что строка должна выглядеть или так "/$logo/регулярное выражение для хэша/$logo/" или так "/регулярное выражение для хэша/$logo/" или так "/$logo/регулярное выражение для хэша/" или так "/регулярное выражение для хэша" Так вот если в проверку попадет $String1 результат должен быть OK! если $String2 тогда WRONG! если $String3 тогда OK! если $String4 тогда OK! если $String5 тогда WRONG! если $String6 тогда OK! если $String7 тогда WRONG! Как должна выглядеть проверка? * Надеюсь так будет понятнее
Можешь ещё спарсить url и получить из него массив. Посмотри функцию parse_url() Да он чё то не понятное лепит.... Ему это явно не надо, что он хочет. Я его попросил роутер мне дать... Он молчит.. Я ему гвоорю покажи как ты маршруты делаешь и тишина... И он мне чё угодно показывает, кроме структуры как он ссылки генерирует... А я хочу ему показать как правильно всю эту конструкцию реализовывать... Мне вот просто интересно он так каждую ссылку будет вручную обрабатывать писать какие не надо...
Всем снова привет, действительно извините что пропал на некоторое время и наверняка объяснил не так как требовалось. По проверке той которую я описывал ранее, думаю приступлю к ней чуть позже. Сейчас мне главное сделать готовую ссылку с хешом. Я решил как должен выглядеть хеш, он будет иметь следующий вид Код (Text): 8 символов - 4 символа - 4 символа - 4 символа - 12 символов пример: Код (Text): 8020d7fe-fs46-4jqc-ai61-a46x92eu947d Как сделать так чтобы пропускало только такие хэши? Пробовал сделать так: Код (Text): if (preg_match('#/([a-z0-9A-Z]{8}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{12})#', $route)) { echo "OK!"; } Но так пропускает и такой хэш Код (Text): 8020d7fe-fs46-4jqc-ai61-a46x92eu947dfj34f3kjfhkefj3kj43kjfhr3kjfewrkfjewhf
@Til_Seier дословно твоё правило звучит как "строка, имеющая подстроку с такой-то структурой". Если тебе надо чтоб именно строка проверялась, а не подстроки в ней - надо добавить в паттерн символы начала и конца строки.
А ты бы мог в мануал заглянуть? Ну вот честно. Ты берешься за регулярки, но ничего про них не хочешь почитать чтоль? Жду готовый код от тебя)
@Til_Seier https://secure.php.net/manual/ru/regexp.reference.meta.php Посмотри мой пример и найди эти символы.
Всем огромное спасибо, ваша помощь очень важна для меня. Вот файл марштутизации сылок. Если у вас есть какие-то предложения или вы видите что в коде можно было бы организовать лучше, напишите пожалуйста, буду рад любой помощи. Хорошо? PHP: class Route { function __construct() { } public static function Start() { $Controller = new Controller(); //параметры по умолчанию $controller_name = '404'; $action_name = 'index'; $hach = ""; $company = "logo"; //преобразуем строку запроса в массив $route_array = explode('/', urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))); $route_array = array_values(array_filter($route_array)); $right_link = true; $route_count = count($route_array); if($route_count > 3){ header('Location: /404'); exit; } foreach ($route_array as $key => $value) { if (preg_match('/^([a-z0-9A-Z]{8}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{4}-[a-z0-9A-Z]{12})$/i',$value,$m)) { if($key != 3){ $hash = $m[1]; } }else if($value == $company){ if( !(($route_count == 3) && ($key == 0 || $key == 2)) && !(($route_count == 2) && ($key == 0 || $key == 1)) && !($route_count == 1) ){ $right_link = false; } }else{ $right_link = false; } } if($Controller->checkHash($hash) && $right_link){ $controller_name = "index"; }else{ $controller_name = "404"; } // добавляем префиксы $model_name = 'Model_' . $controller_name; $controller_name = 'Controller_' . $controller_name; $action_name = 'Action_' . $action_name; if(file_exists(Q_PATH.'/application/models/'.$model_name.'.php')) { include Q_PATH.'/application/models/'.$model_name.'.php'; } if(file_exists(Q_PATH.'/application/controllers/'.$controller_name.'.php')) { include Q_PATH.'/application/controllers/'.$controller_name.'.php'; } else { header('Location: /404'); exit; } $controller = new $controller_name(); $controller->$action_name(); } }
Можно от exit избавится, лучше писать код без него. Чтобы нормально работал destructor если он понадобиться или другие события можно было задействовать.
хм. надо почитать документацию, я когда то давно взял себе за твердое правило после header() всегда ставить exit().
Это очень простой способ быть уверенным, что дальше программа не пойдёт. Но приходиться учитывать, что дальше нет кода который должен что-то сделать. С классами exit можно на return заменить и будет выход, и ещё можно будет в log записать этот запрос после этого return.
Посмотри https://secure.php.net/manual/ru/language.oop5.autoload.php http://www.php-fig.org/psr/psr-4/
explode(); - Делит строку на подстроки по разделителю (возвращает массив подстрок) iconv_strlen(); - Считает количество символов в строке. как вариант...
PHP: <?php /** * Created by PhpStorm. * User: Леонид * Date: 30.04.2016 * Time: 19:55 */ namespace App\Components; use App\Config\Rout As Rout; use App\Controller; class Router extends Rout { private $rout; private $project_name = 'App'; private $package_name = 'Controller'; public function __construct() { //Запись маршрутов $this->rout = $this->getRout(); } private function getUrl () { if (!empty($_SERVER['REQUEST_URI'])) { return trim($_SERVER['REQUEST_URI'], '/'); } } public function rout() { $uri = $this->getUrl(); $uri = explode('?', $uri); if (array_key_exists($uri[0], $this->rout)) { $segments = explode('/', $this->rout[$uri[0]]); $controllerName = array_shift($segments).'Controller'; $controllerName = ucfirst($controllerName); $actionName = 'action'.ucfirst(array_shift($segments)); $parameters = $segments; $fullNameClass = $this->project_name . '\\' . $this->package_name . '\\' . $controllerName; $controllerObject = new $fullNameClass(); if (method_exists($fullNameClass, $actionName)) { call_user_func_array(array($controllerObject, $actionName), $parameters); }; } else { $rrClassName = 'Errors404'; $fullClassErr = $this->project_name . '\\' . $this->package_name . '\\' . $rrClassName; $rr_err = new $fullClassErr; $rr_err->getPage404(); } } } Вот так выглядит мой роутер, но я буду его переписывать мне нравится как реализовано подключение контроллеров, это костыль. Но посмотри, может подцепишь что нибудь интересное и да, посмотри про пространство имён и стандарты PSR-4. Полезная вещь. Так же когда сам познаешь, что такое автозагрузка и сможешь её реализовать сам. Потом выкинь то что ты написал и изучи composer, это очень удобная фича)