За последние 24 часа нас посетил 22791 программист и 1262 робота. Сейчас ищут 728 программистов ...

Не пойму как сделать эту проверку и...

Тема в разделе "PHP для новичков", создана пользователем Til_Seier, 1 июн 2016.

  1. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Всем привет,
    Хочу сделать проверку, наверное простая и я сам мог бы сделать ее, но голова сейчас просто не варит.

    Проверка заключается в следующем:

    Например я принял значения со силки $link = "/logo/fer43-sdf23-df22/logo"

    Мне нужно, чтобы если эта ccылка выглядит так

    PHP:
    1.  /logo/hash/logo (например /logo/fer43-sdf23-df22/logo)
    2. или
    3. /hash/logo (например /fer43-sdf23-df22/logo)
    4. или
    5. /logo/hash (например /logo/fer43-sdf23-df22)
    6. или
    7. /hash (например /fer43-sdf23-df22)
    тогда выводило например ОК!

    а если ccылка не имеет такого вида тогда WRONG LINK!

    Помогите мне пожалуйста

    и еще чтобы например в переменную $hash записывалось значение хэша.
    В данном случае $hash должен равняться fer43-sdf23-df22
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Можешь написать подробнее, что ты вообще хочешь сделать? Ты хочешь сделать чпу ?

    Ты об одной точке входа слышал?
     
    Til_Seier нравится это.
  3. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Да, это и есть 1 точка входа, в файле я принимаю ссылку и в соответствии с ней формируется контент. Сейчас мне нужно сделать проверку, чтобы если ссылка выглядит так кая я описывал выше тогда выводило OK !, а если нет тогда WRONG LINK!
    (Позже я заменю это на нужные данные)
    Можешь помочь с этим?
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Покажи мне свой роутер... И как ты маршрутизируешь ссылки.
    P.S
    Ты случаем не хочешь проверять ручками, каждую входящую ссылку на валидность?
     
    Til_Seier нравится это.
  5. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    В общем, есть трекер 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
    Конечно я не хочу проверять все вручную, мне нужна универсальная проверка
     
    #5 Til_Seier, 1 июн 2016
    Последнее редактирование: 1 июн 2016
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ты что нибудь уже написал? Вообще ты организовал уже единую точку входа, и сам движок и логику работы сделал? Если да то показывай мне свой роутер, и тот файл где ты выставляешь маршруты.
    --- Добавлено ---
    Тут нужно отталкиватьcя от того как ты реализовал маршрутизацию ссылок. И вообще логику ед. входа на страницу.
    --- Добавлено ---
    Вот например у меня в движке есть класс, который отвечает за маршрутизацию ссылок. Я делаю запрос к БД, получаю уникальный id. и те данные которые мне нужны, дальше создаю экземпляр класса маршрутов, и добавляю в него уник id как ссылку, и уже дальше делаю дальше эту проверку что если тек ссылка равна значению из id то всё гуд конфигурируем страницу с нужными параметрами, если нет говорю пошёл нахер такой страницы нет.
    --- Добавлено ---
    можешь id поставить разделителем твоя ссылка и после неё знак ? и дальше эксплодом по вопросу разбей и получешь последнию часть ссылки, а дальше уже сравнивай с id твоим или с чем ты там сравниваешь. И говори если всё хорошо то делай то что надо если нет, то говоришь извините, но мимо.
    --- Добавлено ---
    Пример разбивания ссылки

    PHP:
    1. $link = 'http://ТвояСсылка.ru/ТвойМаршрут/ПофигКакойДлины/ХотьТамдоусрачки/ЕслиТыконечно/ВсёПравильноВСвоёмРоутереНастроил/ТутТвойVoloom?id';
    2. //$_SERVER['REQUEST_URL'] - Получение тек url
    3. $result = explode('?',trim($link));
    4. $id = 'Твой_ID';
    5. if ($result[1] == $id) {
    6.     //Тут уже делай то что тебе нужно
    7. }
    8. else {
    9.     // Иначе перенаправляй на страницу которая будет сообщать, что такой страницы нету
    10. }
    --- Добавлено ---
    PHP:
    1. basename($_SERVER['REQUEST_URI'])
    Ещё можно так получить последний элемент url
    --- Добавлено ---
    Можешь ещё разбить url и получить из него массив.

    Посмотри функцию
    PHP:
    https://php.ru/manual/function.parse-url.html
     
    Til_Seier нравится это.
  7. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Хорошо, давайте так

    Предположим что есть такой код

    Код (Text):
    1. $String1 = "/company/fer43-sdf23-df22/ company/";
    2. $String2 = "/some_text/fer43-sdf23-df22";
    3. $String3 = "/company/fer43-sdf23-df22";
    4. $String4 = "/fer43-sdf23-df22";
    5. $String5 = "/fer43-sdf23-df22/some_text/";
    6. $String6 = "/fer43-sdf23-df22/company/";
    7. $String7 = "/sdf/company/fsd/fer43-sdf23-df22/sdfgsd";
    8.  
    9. $logo = "company";
    10.  
    11. ПРОВЕРКА, что строка должна выглядеть или так
    12. "/$logo/регулярное выражение для хэша/$logo/"
    13. или так
    14. "/регулярное выражение для хэша/$logo/"
    15. или так
    16. "/$logo/регулярное выражение для хэша/"
    17. или так
    18. "/регулярное выражение для хэша"
    Так вот если в проверку попадет $String1 результат должен быть OK!
    если $String2 тогда WRONG!
    если $String3 тогда OK!
    если $String4 тогда OK!
    если $String5 тогда WRONG!
    если $String6 тогда OK!
    если $String7 тогда WRONG!

    Как должна выглядеть проверка?

    * Надеюсь так будет понятнее
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    PHP:
    1. preg_match("/^\/([a-z0-9-]+)\/([a-z0-9]+)\/$/i", "/fer43-sdf23-df22/company/", $output_array);
     
    Til_Seier нравится это.
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Можешь ещё спарсить url и получить из него массив.

    Посмотри функцию parse_url()
    Да он чё то не понятное лепит.... Ему это явно не надо, что он хочет. Я его попросил роутер мне дать... Он молчит.. Я ему гвоорю покажи как ты маршруты делаешь и тишина... И он мне чё угодно показывает, кроме структуры как он ссылки генерирует... А я хочу ему показать как правильно всю эту конструкцию реализовывать...
    Мне вот просто интересно он так каждую ссылку будет вручную обрабатывать писать какие не надо...
     
    Til_Seier нравится это.
  10. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Всем снова привет, действительно извините что пропал на некоторое время и наверняка объяснил не так как требовалось.
    По проверке той которую я описывал ранее, думаю приступлю к ней чуть позже. Сейчас мне главное сделать готовую ссылку с хешом.
    Я решил как должен выглядеть хеш, он будет иметь следующий вид

    Код (Text):
    1. 8 символов - 4 символа - 4 символа - 4 символа - 12 символов
    пример:

    Код (Text):
    1. 8020d7fe-fs46-4jqc-ai61-a46x92eu947d
    Как сделать так чтобы пропускало только такие хэши?

    Пробовал сделать так:

    Код (Text):
    1. 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)) {
    2.                 echo "OK!";
    3. }
    Но так пропускает и такой хэш

    Код (Text):
    1. 8020d7fe-fs46-4jqc-ai61-a46x92eu947dfj34f3kjfhkefj3kj43kjfhr3kjfewrkfjewhf
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    @Til_Seier дословно твоё правило звучит как "строка, имеющая подстроку с такой-то структурой". Если тебе надо чтоб именно строка проверялась, а не подстроки в ней - надо добавить в паттерн символы начала и конца строки.
     
    Til_Seier нравится это.
  12. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Так думаю именно это и нужно чтобы проверялась подстрока
    Ты бы мог сделать эту проверку?
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    А ты бы мог в мануал заглянуть? Ну вот честно. Ты берешься за регулярки, но ничего про них не хочешь почитать чтоль? Жду готовый код от тебя)
     
    Til_Seier нравится это.
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Til_Seier нравится это.
  15. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Всем огромное спасибо, ваша помощь очень важна для меня.
    Вот файл марштутизации сылок.
    Если у вас есть какие-то предложения или вы видите что в коде можно было бы организовать лучше, напишите пожалуйста, буду рад любой помощи. Хорошо?

    PHP:
    1. class Route {
    2.     function __construct() {
    3.        
    4.     }
    5.    
    6.     public static function Start() {
    7.  
    8.             $Controller = new Controller();
    9.  
    10.             //параметры по умолчанию
    11.             $controller_name = '404';
    12.             $action_name = 'index';
    13.        
    14.             $hach = "";
    15.             $company = "logo";
    16.  
    17.             //преобразуем строку запроса в массив
    18.             $route_array = explode('/', urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)));
    19.  
    20.             $route_array = array_values(array_filter($route_array));
    21.             $right_link = true;
    22.             $route_count = count($route_array);
    23.             if($route_count > 3){
    24.                 header('Location: /404');
    25.                 exit;
    26.             }
    27.  
    28.             foreach ($route_array as $key => $value) {
    29.                 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)) {
    30.                     if($key != 3){
    31.                         $hash = $m[1];
    32.                     }
    33.                 }else if($value == $company){
    34.                     if(
    35.                         !(($route_count == 3) && ($key == 0 || $key == 2)) &&
    36.                         !(($route_count == 2) && ($key == 0 || $key == 1)) &&
    37.                         !($route_count == 1)
    38.                     ){
    39.                         $right_link = false;
    40.                     }
    41.                 }else{
    42.                     $right_link = false;
    43.                 }
    44.             }
    45.  
    46.             if($Controller->checkHash($hash) && $right_link){
    47.                 $controller_name = "index";
    48.             }else{
    49.                 $controller_name = "404";
    50.             }          
    51.             // добавляем префиксы
    52.             $model_name = 'Model_' . $controller_name;
    53.             $controller_name = 'Controller_' . $controller_name;
    54.             $action_name = 'Action_' . $action_name;
    55.            
    56.             if(file_exists(Q_PATH.'/application/models/'.$model_name.'.php')) {
    57.                 include Q_PATH.'/application/models/'.$model_name.'.php';
    58.             }
    59.  
    60.             if(file_exists(Q_PATH.'/application/controllers/'.$controller_name.'.php')) {
    61.                 include Q_PATH.'/application/controllers/'.$controller_name.'.php';
    62.             }
    63.             else {
    64.                 header('Location: /404');
    65.                 exit;
    66.             }
    67.  
    68.             $controller = new $controller_name();
    69.             $controller->$action_name();
    70.     }
    71.  
    72. }
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Можно от exit избавится, лучше писать код без него.
    Чтобы нормально работал destructor если он понадобиться или другие события можно было задействовать.
     
    Til_Seier нравится это.
  17. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Спасибо, от exit избавился. Возможно у кого-то есть еще какие-то мысли по поводу кода?
     
  18. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    хм. надо почитать документацию, я когда то давно взял себе за твердое правило после header() всегда ставить exit().
     
    Til_Seier нравится это.
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Это очень простой способ быть уверенным, что дальше программа не пойдёт.
    Но приходиться учитывать, что дальше нет кода который должен что-то сделать.
    С классами exit можно на return заменить и будет выход, и ещё можно будет в log записать этот запрос после этого return.
     
    Til_Seier нравится это.
  20. Til_Seier

    Til_Seier Новичок

    С нами с:
    21 мар 2016
    Сообщения:
    44
    Симпатии:
    1
    Возможно еще что-то по поводу кода? Какие еще предложения, советы, замечания?
     
  21. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  22. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    explode(); - Делит строку на подстроки по разделителю (возвращает массив подстрок)
    iconv_strlen(); - Считает количество символов в строке.

    как вариант...
     
    Til_Seier нравится это.
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: Леонид
    5. * Date: 30.04.2016
    6. * Time: 19:55
    7. */
    8.  
    9. namespace App\Components;
    10.  
    11. use App\Config\Rout As Rout;
    12. use App\Controller;
    13. class Router extends Rout
    14. {
    15.     private $rout;
    16.     private $project_name = 'App';
    17.     private $package_name = 'Controller';
    18.  
    19.     public function __construct()
    20.         {
    21.             //Запись маршрутов
    22.             $this->rout = $this->getRout();
    23.         }
    24.  
    25.  
    26.     private function getUrl ()
    27.     {
    28.         if (!empty($_SERVER['REQUEST_URI'])) {
    29.             return trim($_SERVER['REQUEST_URI'], '/');
    30.         }
    31.     }
    32.     public function rout()
    33.     {
    34.         $uri = $this->getUrl();
    35.  
    36.  
    37.         $uri = explode('?', $uri);
    38.         if (array_key_exists($uri[0],  $this->rout))
    39.         {
    40.             $segments = explode('/', $this->rout[$uri[0]]);
    41.             $controllerName = array_shift($segments).'Controller';
    42.  
    43.             $controllerName = ucfirst($controllerName);
    44.             $actionName = 'action'.ucfirst(array_shift($segments));
    45.             $parameters = $segments;
    46.             $fullNameClass = $this->project_name . '\\' . $this->package_name . '\\' . $controllerName;
    47.  
    48.             $controllerObject = new $fullNameClass();
    49.  
    50.             if (method_exists($fullNameClass,  $actionName))
    51.             {
    52.                call_user_func_array(array($controllerObject, $actionName), $parameters);
    53.             };
    54.  
    55.  
    56.         }
    57.         else {
    58.             $rrClassName = 'Errors404';
    59.             $fullClassErr = $this->project_name . '\\' . $this->package_name . '\\' . $rrClassName;
    60.             $rr_err = new $fullClassErr;
    61.             $rr_err->getPage404();
    62.         }
    63.     }
    64. }
    Вот так выглядит мой роутер, но я буду его переписывать мне нравится как реализовано подключение контроллеров, это костыль. Но посмотри, может подцепишь что нибудь интересное и да, посмотри про пространство имён и стандарты PSR-4. Полезная вещь. Так же когда сам познаешь, что такое автозагрузка и сможешь её реализовать сам. Потом выкинь то что ты написал и изучи composer, это очень удобная фича)
     
    Til_Seier нравится это.