Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как убрать ненужный элемент из строки?
 
 автор: sega_z   (18.05.2012 в 12:22)   письмо автору
 
 

Подскажите пожалуйста, как вообще убрать "page=..." из строки, состоящей из URL адреса страницы.

Строка может состоять только из URL адреса, например:

1) http://www.....ru/car/automobil_legkovaya.php?page=2&marka=vaz
2) http://www.....ru/car/automobil_legkovaya.php?marka=vaz&page=2
2) http://www.....ru/car/automobil_legkovaya.php?page=2

Возможные варианты URL адреса:

1) значение "page=..." может быть только какое либо целое число (номер страницы);
2) "page=..." может находится в любом месте: после "?", после "&", между "&".
3 ) "page=..." может вообще не быть в URL адресе.

P.S. Необходимо сделать возврат на строку с которой пришел посетитель (внутри сайта), но без "page=..."

  Ответить  
 
 автор: mihdan   (18.05.2012 в 12:37)   письмо автору
 
   для: sega_z   (18.05.2012 в 12:22)
 

preg_replace с выражение /&?page=[0-9]+/i

  Ответить  
 
 автор: sega_z   (18.05.2012 в 12:48)   письмо автору
 
   для: mihdan   (18.05.2012 в 12:37)
 

Страницу я вытаскиваю при помощи:

$url = $_SERVER['HTTP_REFERER']; // получает URL, с которого пришёл посетитель
preg_match_all("#(http)?([^:/]+)#",$url,$match);
$url_host = $match[0][1]; // Корневой каталог
$url_host_katalog = $match[0][2]; // Каталог
$url_host_stranica = $match[0][3]; // Страница (c ?razd=...)


А можно, как то вышеуказанное условие добавить в строку:
preg_match_all("#(http)?([^:/]+)#",$url,$match);
(чтобы упростить код).

Или возможно только так:

$url = $_SERVER['HTTP_REFERER']; // получает URL, с которого пришёл посетитель
preg_match_all("#(http)?([^:/]+)#",$url,$match);
$url_host = $match[0][1]; // Корневой каталог
$url_host_katalog = $match[0][2]; // Каталог
$url_host_stranica = $match[0][3]; // Страница (c ?razd=...)

$url_host_stranica = preg_match_all("/&?page=[0-9]+/i",$url_host_stranica);

  Ответить  
 
 автор: mihdan   (18.05.2012 в 12:53)   письмо автору
 
   для: sega_z   (18.05.2012 в 12:48)
 

Смысл парсить УРЛ регулярками? Есть же parse_url, parse_str.

А выражение вы можете поставить в удобное для вас место.

  Ответить  
 
 автор: sega_z   (18.05.2012 в 13:02)   письмо автору
 
   для: mihdan   (18.05.2012 в 12:53)
 

Код выдал ошибку: preg_match_all() expects at least 3 parameters, 2 given

$url = $_SERVER['HTTP_REFERER']; // получает URL, с которого пришёл посетитель
preg_match_all("#(http)?([^:/]+)#",$url,$match);
$url_host = $match[0][1]; // Корневой каталог
$url_host_katalog = $match[0][2]; // Каталог
$url_host_stranica = $match[0][3]; // Страница (c ?razd=...)

$url_host_stranica = preg_match_all("/&?page=[0-9]+/i",$url_host_stranica);


А чем лучше parse_url, parse_str?

  Ответить  
 
 автор: confirm   (18.05.2012 в 13:05)   письмо автору
 
   для: sega_z   (18.05.2012 в 13:02)
 

Разбор рег. выражениями, операции затратные.

  Ответить  
 
 автор: sega_z   (18.05.2012 в 13:07)   письмо автору
 
   для: confirm   (18.05.2012 в 13:05)
 

Предыдущую ошибку нашел, но в результате остается знак "&": http://www.....ru/car/automobil_legkovaya.php?&marka=vaz

$url = $_SERVER['HTTP_REFERER']; // получает URL, с которого пришёл посетитель
preg_match_all("#(http)?([^:/]+)#",$url,$match);
$url_host = $match[0][1]; // Корневой каталог
$url_host_katalog = $match[0][2]; // Каталог
$url_host_stranica = $match[0][3]; // Страница (c ?razd=...)

$url_host_stranica = preg_replace("/&?page=[0-9]+/i","",$url_host_stranica);


Не знаю,как его убрать?

  Ответить  
 
 автор: confirm   (18.05.2012 в 13:43)   письмо автору
 
   для: sega_z   (18.05.2012 в 13:07)
 

Открываем руководство по РНР и читаем о функциях parse_url и parse_str, после чего выбрасываем preg_replace из данной задачи. Ну не место ей тут, если это можно сделать проще.

  Ответить  
 
 автор: sega_z   (18.05.2012 в 14:35)   письмо автору
 
   для: confirm   (18.05.2012 в 13:43)
 

Ну хорошо, вытащил я страницу с помощью parse_url и вытащил значение "page" с помощью parse_str:


$url = $_SERVER['HTTP_REFERER']; // получает URL, с которого пришёл посетитель
$url_host_stranica = parse_url($url, PHP_URL_QUERY); // вытаскиваем из URL все данные после ?
$url_host_stranica = parse_str($url_host_stranica);


И что дальше, как избавиться то от "page=..." в URL адресе?

  Ответить  
 
 автор: confirm   (18.05.2012 в 15:02)   письмо автору
 
   для: sega_z   (18.05.2012 в 14:35)
 

А все, никак, ловушка. )
<?
$url 
'http://www.domain.ru/car/automobil_legkovaya.php?page=2&marka=vaz&var1=33&var2=14';
$url parse_url($url);
parse_str($url['query'],$query);
$url $url['scheme'].'://'.$url['host'].$url['path'].'?'.http_build_query(array_diff_key($query, array('page'=>1)));
echo 
$url;

  Ответить  
 
 автор: sega_z   (18.05.2012 в 15:36)   письмо автору
 
   для: confirm   (18.05.2012 в 15:02)
 

Да действительно ловушка :) Я бы до этого не додумался. Я даже не понял логический смысл этого кода.
Т.е. Вы хотите сказать, что этот код намного легче и проще вышеуказанного с рег. выражениями?

  Ответить  
 
 автор: confirm   (18.05.2012 в 15:46)   письмо автору
 
   для: sega_z   (18.05.2012 в 15:36)
 

Вы прочтите о механизме разбора рег. выражениями.
Можно загрузить процессор длинной инструкцией, что вроде бы хорошо на первый взгляд, а можно заменить эту инструкцию большим числом инструкций, но коротких и не требующих сложной адресации. И второе будет выполнено быстрее, и это не парадокс. Именно эта концепция положена в архитектуру RISC процессоров, которые теперь являются неотъемлемой частью современных процессоров.
Ну а о том, что я написал нужно не додумываться, а чаще заглядывать в руководство РНР, в нем можно найти ответы на многие свои вопросы. Вы прочтите о тех функциях, которые я применил.

  Ответить  
 
 автор: sega_z   (20.05.2012 в 22:44)   письмо автору
 
   для: confirm   (18.05.2012 в 15:46)
 

Никак не могу понять, как изменить данный код, чтобы в итоге осталось: car/automobil.php?page=2&marka=vaz&var1=33&var2=14 (без http://, домена и слеша после домена )

$url = 'http://www.domain.ru/car/automobil.php?page=2&marka=vaz&var1=33&var2=14';
$url = parse_url($url);
parse_str($url['query'],$query);
$url = $url['scheme'].'://'.$url['host'].$url['path'].'?'.http_build_query(array_diff_key($query, array('page'=>1)));
echo $url;

  Ответить  
 
 автор: confirm   (21.05.2012 в 00:33)   письмо автору
 
   для: sega_z   (20.05.2012 в 22:44)
 

Когда же вы читать начнете.

<?
$url 
'http://www.domain.ru/car/automobil.php?page=2&marka=vaz&var1=33&var2=14'
$url parse_url($url);
print_r($url);
?>
Array ( 
  [scheme] => http 
  [host] => www.domain.ru 
  [path] => /car/automobil.php 
  [query] => page=2&marka=vaz&var1=33&var2=14 )

А значит, вам нужно только то, что содержат ключи "path" и "query" этого массива. Причем не обязательно, использовать array_diff_key($query, array('page'=>1)) в вашем случае, если вам нужно будет удалить только один ключ в массиве, достаточно будет unset($query['page']):
<?
parse_str
($url['query'],$query);
unset(
$query['page']);
echo 
$url['path'].'?'.http_build_query($query);
Если требуется удалить несколько ключей из множества, тогда и поможет array_diff_key().

  Ответить  
 
 автор: sega_z   (21.05.2012 в 13:21)   письмо автору
 
   для: confirm   (21.05.2012 в 00:33)
 

Как тем же самым методом вытащить только название каталога "car" после домена:

<?
$url 
'http://www.domain.ru/car/automobil.php?page=2&marka=vaz&var1=33&var2=14'
parse_url($urlPHP_URL_PATH);
?> 


так вытаскивает каталог вместе с страницей

Или можно только регуляркой вытащить?

preg_match_all("#([^:/?]+)#",$url,$match);

echo $match[0][1]."<br>"; // Корневой каталог
echo $match[0][2]."<br>"; // Каталог
echo $match[0][3]."<br>"; // Страница (без ?id=...)

  Ответить  
 
 автор: confirm   (21.05.2012 в 14:28)   письмо автору
 
   для: sega_z   (21.05.2012 в 13:21)
 

parse_url($url, PHP_URL_PATH); - это для работы вы пишите или для отчетности?
<?
$path 
explode('/',ltrim(parse_url($urlPHP_URL_PATH),'/'));
print_r($path);

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования