[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ЧПУ условие
santaros
Добрый вечер. Помогите составить условие для преобразования ссылок.

Нужно что бы преобразовались ссылки:

index.php?op=news (/news)
index.php?op=search (/search)
index.php?op=news&id=23 (/news/23)
index.php?op=news&blocked&id=23 (/news/blocked/32)
index.php?op=news$edit=23 (/news/edit/23)
index.php?op=news&del=23 (/news/del/23)

Имеется функция которая проверяет ссылки:

        // ЧПУ
function mod_rewrite($url){
global $mod_rewrite;
if ($mod_rewrite){
if (preg_match('#^[a-zA-Z\.]+\?[a-zA-Z]+\=[a-zA-Z]+$#i',$url)){

$url=substr($url,1);
$url=substr($url,strpos($url,'?')+1);
$variable_name = substr($url,0,strpos($url,'='));
$variable_val = substr($url,strpos($url,'=')+1);
return $variable_name.'/'.$variable_val;

} else {
return $url;
}
}
}

В функции имеется условие #^[a-zA-Z\.]+\?[a-zA-Z]+\=[a-zA-Z]+$#i. Оно работает для ссылок index.php?op=news

Но вот как сделать условие для index.php?op=news&id=23 или index.php?op=news&blocked&id=23 никак не допру.... Копался в редакторе RegExr, тоже ничего не понял.

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



Спустя 6 минут, 21 секунда (7.05.2011 - 22:13) alex12060 написал(а):
Это делается в .htaccess


RewriteRule ^([a-z]_\.)/([0-9])+$ index.php?op=$1&id=$2


Как-то так.

Спустя 3 минуты, 2 секунды (7.05.2011 - 22:16) santaros написал(а):
alex12060
Упс, только что заметил что вы написали про htaccess.

Но ведь прежде чем в htaccess. что то делать, нужно что бы функция возвращала ссылку...преобразованную.

Спустя 3 минуты, 28 секунд (7.05.2011 - 22:19) alex12060 написал(а):
Нет. Я тут вообще не советую делать функцию.
Почитай про htaccess

Но если по велосипеду, то делать так:

Получаешь УРЛ в строку, разбераешь ее с помощью parse_url(), считаешь полученные данные и уже подставляешь в нормальные ссылки.

Спустя 3 минуты, 14 секунд (7.05.2011 - 22:23) santaros написал(а):
alex12060
Дык у меня так и делается...
Просто у меня всё идёт через index.php поэтому я подумал что лучше будет сделать функцию.... тем более я смогу её выключать если нужно.

Функция проверяет ссылки и преобразует их если нужно.
А в htaccess у меня есть условие которое позволяет ссылке работать:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !(admin)
RewriteRule ^([a-zA-Z0-9]+)$ index.php?op=$1 [QSA,L]

Мне нужно правильно сформировать условия в функции, что бы функция выдавала мне назад преобразованную ссылку, а не обычную.

Сейчас она работает с ссылками index.php?op=news
А вот с ссылками index.php?op=news&id=21 не работает. Возвращает старую ссылку index.php?op=news&id=21

Спустя 2 минуты, 37 секунд (7.05.2011 - 22:25) Winston написал(а):
Цитата (santaros @ 7.05.2011 - 21:07)
Нужно что бы преобразовались ссылки:

index.php?op=news (/news)
index.php?op=search (/search)
index.php?op=news&id=23 (/news/23)
index.php?op=news&blocked&id=23 (/news/blocked/32)
index.php?op=news$edit=23 (/news/edit/23)
index.php?op=news&del=23 (/news/del/23)


Примерно так
    RewriteEngine On
RewriteBase /

// Для (/news) и (/search)
RewriteRule ^([a-z0-9_-]+)/?$ index.php?op=$1

// Для (/news/23)
RewriteRule ^([a-z0-9_-]+)/([0-9]+)/?$ index.php?op=$1&id=$2

// Для (/news/blocked/32)
RewriteRule ^([a-z0-9_-]+)/([a-z0-9_-]+)/([0-9]+)/?$ index.php?op=$1&blocked=$2&id=$3

// Для (/news/edit/23)
RewriteRule ^([a-z0-9_-]+)/([0-9]+)/?$ index.php?op=$1&edit=$2

// Для (/news/del/23)
RewriteRule ^([a-z0-9_-]+)/([0-9]+)/?$ index.php?op=$1&del=$2


А для ссылок так можно
Для index.php?op=news&id=23
#^index.php\?[a-z]{2}=[a-z]+&[a-z]{2}=\d+$#i

index.php?op=news&blocked&id=23 -> у параметра blocked должно быть какое то значение
Для index.php?op=news&blocked=true&id=23
#^index.php\?[a-z]+=[a-z]+&[a-z]+=[a-z]+&[a-z]{2}=\d+$#i

Спустя 1 минута, 20 секунд (7.05.2011 - 22:27) sharki написал(а):
PHPprogramer
И ты будешь прописывать условие в htaccess как только появится новый модуль. или еще одна подподкатегория?)

Спустя 35 секунд (7.05.2011 - 22:27) Winston написал(а):
Вот отличная функция которая формирует ссылки

Спустя 2 минуты, 32 секунды (7.05.2011 - 22:30) Winston написал(а):
Цитата (sharki @ 7.05.2011 - 21:27)
И ты будешь прописывать условие в htaccess как только появится новый модуль. или еще одна подподкатегория?)

Одну строчку не сложно дописать.
Просвети как по другому сделать ?

Спустя 3 минуты, 6 секунд (7.05.2011 - 22:33) sharki написал(а):
PHPprogramer
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

И там уже парсить всю строку как тебе угодно =)

Спустя 10 минут, 39 секунд (7.05.2011 - 22:43) santaros написал(а):
PHPprogramer
А нет ли функции по проще. Та функция работает с Get и не слишком понятно как она преобразует.

Спустя 6 минут, 45 секунд (7.05.2011 - 22:50) Winston написал(а):
Цитата (santaros @ 7.05.2011 - 21:43)
А нет ли функции по проще.

Вот моя функция, она попроще biggrin.gif
Цитата (santaros @ 7.05.2011 - 21:43)
Та функция работает с Get

Нет она с get не работает, ссылки там формируются так:
<a href="<?php echo href('page=main', 'rem=read'); ?>">
И в зависимости если mod_rewrite выключен получаем
page=main&rem=read
если включен
main/read

Спустя 31 минута, 19 секунд (7.05.2011 - 23:22) santaros написал(а):
PHPprogramer
Странно, но у меня ваша функция почему то выводит пустое значение....
Хотя вроде всё правильно делаю.

Спустя 1 минута, 56 секунд (7.05.2011 - 23:23) neadekvat написал(а):
santaros, что ты ожидал, отправив свой пост? Что тебе что-то подскажут? Тогда где код, включая саму функцию и ее использование?

Спустя 27 секунд (7.05.2011 - 23:24) alex12060 написал(а):
santaros

Тебе надо преобразовать такое: http://www.test.ru/page/lala/id/12
в это: http://www.test.ru/?page=lala&id=12

Я прав? Или наоборот?

Спустя 9 минут, 21 секунда (7.05.2011 - 23:33) santaros написал(а):
neadekvat
Функция:

function mod_rewrite($url){
global $mod_rewrite;
if ($mod_rewrite){
if (preg_match('#^[a-zA-Z\.]+\?[a-zA-Z]+\=[a-zA-Z]+$#i',$url)){

$url=substr($url,1);
$url=substr($url,strpos($url,'?')+1);
$variable_val = substr($url,strpos($url,'=')+1);
return $variable_val;

} else {
return $url;
}
}
}


Применение:

<a href="'.mod_rewrite("index.php?op=news"). '">Новости</a>

Возвращает ссылку вида /news вместо index.php?op=news

Нужно добавить условия в функцию(выше) что бы преобразовывались ссылки вида index.php?op=news&id=21 в ссылки /news/21

alex12060
Наоборот.
http://www.test.ru/?page=lala&id=12
в
http://www.test.ru/lala/12

Спустя 2 минуты, 58 секунд (7.05.2011 - 23:36) neadekvat написал(а):
Цитата (santaros @ 8.05.2011 - 00:33)
Возвращает ссылку вида /news вместо index.php?op=news

Так поставь $mod_rewrite в false.

Спустя 3 минуты, 32 секунды (7.05.2011 - 23:40) santaros написал(а):
neadekvat
Это я как удачный пример привёл.
мне нужно что бы он так же возвращал ссылку /news/21 вместо index.php?op=news&id=21
Для этого необходимо условие в функции.

Спустя 3 минуты, 47 секунд (7.05.2011 - 23:44) neadekvat написал(а):
Цитата (santaros @ 8.05.2011 - 00:33)
Возвращает ссылку вида /news вместо index.php?op=news

Как я должен был понять эти слова?..

Ладно.

$mod_rewrite вообще определена?

Спустя 8 минут, 36 секунд (7.05.2011 - 23:52) santaros написал(а):
neadekvat
Вы не поняли. Функция прекрастно работает. $mod_rewrite определена.

Но возвращаются преобразованными только ссылки вида index.php?op=news.
А вот ссылки другого вида index.php?op=news&id=23 возвращаются не преобразованными, тоесть так и остаются index.php?op=news&id=23.

Мне нужна помощь в доработке функции mod_rewrite, что бы она преобразовывала ссылки index.php?op=news&id=23 в ссылки /news/23

Спустя 4 минуты, 30 секунд (7.05.2011 - 23:57) neadekvat написал(а):
function href()
{
$args = func_get_args();
$href = '';

if ($args[0] == 'host')
return HOST;

foreach($args as $var)
{
$param = explode('=', $var);
$href .= '/'. $param[1];
}

return HOST . ltrim($href, '/');
}

Сюда только добавить усолвие mod_rewrite и определить HOST.

Спустя 5 минут, 34 секунды (8.05.2011 - 00:02) Winston написал(а):
Цитата (santaros @ 7.05.2011 - 22:52)
Мне нужна помощь в доработке функции mod_rewrite, что бы она преобразовывала ссылки index.php?op=news&id=23 в ссылки /news/23

Я же внизу этого поста написал 2 шаблона регекспа для преобразования ссылок.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.