За последние 24 часа нас посетили 38950 программистов и 7544 робота. Сейчас ищет 1591 программист ...

помогите с регуляркой php

Тема в разделе "PHP для новичков", создана пользователем ufaclub, 24 апр 2023.

  1. ufaclub

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

    С нами с:
    29 авг 2011
    Сообщения:
    56
    Симпатии:
    0
    $a="/catalog/tovarurl/price/2578/";

    как вырезать ту часть что содержит /price/xxx/, где xxx - произвольный набор знаков и символов

    т.е по итогу хочу получить переменную $b="/catalog/tovarurl/";

    т.е вырезать хвост из переменной включая /price/2578/


    и создать переменную $c которая содержит значение xxx в данном случае 2578
     
  2. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Регулярку надо поместить в файл .htaccess я так понимаю?
     
  3. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Можете попробовать использовать substr как вариант...
     
  4. ufaclub

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

    С нами с:
    29 авг 2011
    Сообщения:
    56
    Симпатии:
    0
    нет имен в php сделать к url это не относится в конкретном примере. с концом $c уже разобрался а вот как получить из

    $a="/catalog/tovarurl/price/2578/";

    $b="/catalog/tovarurl/";


    т.е отрезать /price/2578/ это вот не получается где 2578 может быть любое число
     
  5. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Так echo substr($a, 17);
     
  6. ufaclub

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

    С нами с:
    29 авг 2011
    Сообщения:
    56
    Симпатии:
    0
    я так понял что 17 это номер символа от начала?

    но тут условие еще есть

    вот тут $a="/catalog/tovarurl/price/2578/";

    tovarurl может быть тоже любой длины и вида


    вот частный пример

    вот тут $a="/catalog/aaaaxxxxssx/yydyd/price/2578/";

    т.е как то привязку нужно сделать к слову /price/ и удалить его и все что после него из строки $a="/catalog/aaaaxxxxssx/yydyd/price/2578/";
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    разбейте на массив через explode('/",$str);
    и посмотрите что в массиве... не того ли вы хотели?
     
  8. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    PHP:
    1. <?php
    2.  
    3.  
    4. function getUrlParams($route){
    5.     $params = explode("/", $route);
    6.     array_shift($params);
    7.     array_pop($params);
    8.  
    9.     $url = "/";
    10.     $c = end($params);
    11.  
    12.     foreach($params as $param){
    13.         if($param === 'price'){
    14.             break;
    15.         }
    16.          $url = $url . $param . '/';
    17.     }
    18.     return [$url, $c];
    19. }
    20.  
    21. /*
    22. *Тесты
    23. */
    24.  
    25. $route = "/catalog/tovarurl/price/2578/";
    26. $route2 = "/catalog/aaaaxxxxssx/yydyd/price/11111/";
    27. $route3 = "/catalog/aaaaxxxxssx/yydyd/price/sdrfgf/8546733/";
    28. $route4 = "/catalog/aaaax/ssx/yydyd/hsduyuysr/jksdfjsf/price/qweqe/sdrfgf/555555/";
    29.  
    30. print_r(getUrlParams($route));
    31. print_r(getUrlParams($route2));
    32. print_r(getUrlParams($route3));
    33. print_r(getUrlParams($route4));
    Результат
    Код (Text):
    1. Array
    2. (
    3.     [0] => /catalog/tovarurl/
    4.     [1] => 2578
    5. )
    6. Array
    7. (
    8.     [0] => /catalog/aaaaxxxxssx/yydyd/
    9.     [1] => 11111
    10. )
    11. Array
    12. (
    13.     [0] => /catalog/aaaaxxxxssx/yydyd/
    14.     [1] => 8546733
    15. )
    16. Array
    17. (
    18.     [0] => /catalog/aaaax/ssx/yydyd/hsduyuysr/jksdfjsf/
    19.     [1] => 555555
    20. )
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    А вот как решил gpt

    PHP:
    1. function extractUrlAndPrice($url) {
    2.   // Разбиваем строку на части по разделителю "/"
    3.   $parts = explode('/', $url);
    4.  
    5.   // Ищем индекс элемента "price"
    6.   $priceIndex = array_search('price', $parts);
    7.  
    8.   // Если элемент "price" найден, удаляем его и все элементы, идущие после него
    9.   if ($priceIndex !== false) {
    10.     array_splice($parts, $priceIndex);
    11.   }
    12.  
    13.   // Объединяем оставшиеся элементы в новую строку и возвращаем ее
    14.   $newUrl = implode('/', $parts);
    15.  
    16.   // Извлекаем значение параметра "price" из исходной строки
    17.   $price = null;
    18.   preg_match('/\/price\/(.+?)\//', $url, $matches);
    19.   if (count($matches) === 2) {
    20.     $price = $matches[1];
    21.   }
    22.  
    23.   // Возвращаем результат в виде массива
    24.   return array(
    25.     'url' => $newUrl,
    26.     'price' => $price
    27.   );
    28. }
    Мне мой способ больше нравится, его проще читать.
     
  11. AndreyS

    AndreyS Новичок

    С нами с:
    24 апр 2023
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Düsseldorf
    PHP:
    1. $a = "/catalog/tovarurl/price/2578/";
    2. $sub = mb_strrchr($a, 'price'); // 'price/2578/'
    3.  
    4. $b = str_replace($sub, '', $a); // '/catalog/tovarurl/'
    5.  
    6. $t = str_replace('price/', '', $sub); // '2578/'
    7. $c = mb_substr($t, 0, mb_strpos($t, '/')); // '2578'
     
  12. Александр Петрович

    Александр Петрович Активный пользователь

    С нами с:
    14 ноя 2019
    Сообщения:
    12
    Симпатии:
    0
    PHP:
    1. $a = "/catalog/tovarurl/price/2578/";
    2. preg_match('#(/catalog/[a-z]*/)price/([0-9]*)/#', $a, $match);
    3. $str = $match[1];
    4. $c = $match[2];
     
    #12 Александр Петрович, 9 май 2023
    Последнее редактирование: 9 май 2023
  13. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
  14. Александр Петрович

    Александр Петрович Активный пользователь

    С нами с:
    14 ноя 2019
    Сообщения:
    12
    Симпатии:
    0
    Обязательно объяснять)
     
  15. Александр Петрович

    Александр Петрович Активный пользователь

    С нами с:
    14 ноя 2019
    Сообщения:
    12
    Симпатии:
    0
    Хотя да, правильней будет такой вариант
    PHP:
    1. $a = "/catalog/tovarurl/price/2578/";
    2. preg_match('#(/catalog/.*/)price/([0-9]*)/#', $a, $match);
    3. $str = $match[1];
    4. $c = $match[2];
     
  16. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    PHP:
    1. $a = "/catalog//price//";
     
  17. Александр Петрович

    Александр Петрович Активный пользователь

    С нами с:
    14 ноя 2019
    Сообщения:
    12
    Симпатии:
    0
    Спасибо за объяснения, теперь стало все понятно.
    Добавлю от себя разъяснения.
    Мое решение - это не истина в конечной инстанции. Я просто подкинул идею. Идея заключается в том, что можно регуляркой вытащить из строки то, что необходимо. Использовать мой вариант или парсить строку - решать тому, кто будет делать эту задачу. Я ТЗ не видел, точно не знаю, что надо сделать.
    Что касается варианта
    PHP:
    1. $a = "/catalog//price//";
    то идея остается та-же, просто вытаскиваем значения между catalog и price и проверяем на пустоту
    PHP:
    1. $a = "/catalog/tovarurl/price/2578/";
    2. preg_match('#/catalog/(.*)/price/(.*)/#', $a, $match);
    3. if (empty($match[1]) || empty($match[2])) {
    4.     // 404
    5. }
    6. $str = '/catalog/' . $match[1] . '/';
    7. $c = $match[2];
    Если, конечно, есть вероятность того, что придет такой урл
     
  18. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147