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

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

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

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

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

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

 

Регулярку надо поместить в файл .htaccess я так понимаю?

 

Можете попробовать использовать substr как вариант…

 

нет имен в php сделать к url это не относится в конкретном примере. с концом $c уже разобрался а вот как получить из

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

$b=»/catalog/tovarurl/»;

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

 

Так echo substr($a, 17);

 

я так понял что 17 это номер символа от начала?

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

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

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

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

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

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

 

разбейте на массив через explode(‘/»,$str);
и посмотрите что в массиве… не того ли вы хотели?

 

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 . «https://php.ru/»;
  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. )
 

А вот как решил gpt

PHP:
  1. function extractUrlAndPrice($url) {
  2.   // Разбиваем строку на части по разделителю «/»
  3.   $parts = explode(«https://php.ru/», $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(«https://php.ru/», $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. }

Мне мой способ больше нравится, его проще читать.

 

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, «https://php.ru/»)); // ‘2578’
 

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];
 

@Александр Петрович, ещё один говнокодер детектед, объяснять, чем решение криво?

 

Обязательно объяснять)

 

Хотя да, правильней будет такой вариант

PHP:
  1. $a = «/catalog/tovarurl/price/2578/»;
  2. preg_match(‘#(/catalog/.*/)price/([0-9]*)/#’, $a, $match);
  3. $str = $match[1];
  4. $c = $match[2];
 

PHP:
  1. $a = «/catalog//price//»;
 

Спасибо за объяснения, теперь стало все понятно.
Добавлю от себя разъяснения.
Мое решение — это не истина в конечной инстанции. Я просто подкинул идею. Идея заключается в том, что можно регуляркой вытащить из строки то, что необходимо. Использовать мой вариант или парсить строку — решать тому, кто будет делать эту задачу. Я ТЗ не видел, точно не знаю, что надо сделать.
Что касается варианта

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] . «https://php.ru/»;
  7. $c = $match[2];

Если, конечно, есть вероятность того, что придет такой урл

 

@Александр Петрович, регулярка некорректная, можно в ней сразу правила задавать )

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *