2013-11-19 2 views
-1

Может ли кто-нибудь предложить метод в php или функцию для парсинга SEO-дружественных URL-адресов, которые не связаны с htaccess или mod_rewrite? Примеры были бы удивительными.синтаксический анализ SEO дружественный URL-адрес без htaccess или mode_rewrite

http://url.org/file.php/test/test2#3 

Это возвращает: Array (схема] => HTTP [хост] => url.org [путь] => /file.php/test/test2 [фрагмент] => 3) /file.php/ test/test2

Как бы выделить раздел /file.php/test/test2? Я думаю, тест и test2 будут аргументами.

EDIT:

@Martijn - я выяснить, что ваш предложил, прежде чем получить уведомление о Вашем ответе. Спасибо, кстати. Это считается приемлемым методом?

$url = 'http://url.org/file.php/arg1/arg2#3'; 
$test = parse_url($url); 
echo "host: $test[host] <br>"; 
echo "path: $test[path] <br>"; 
echo "frag: $test[fragment] <br>"; 
$path = explode("/", trim($test[path])); 
echo "1: $path[1] <br>"; 
echo "2: $path[2] <br>"; 
echo "3: $path[3] <br>"; 
echo "4: $path[4] <br>"; 
+0

Drop Apache и использовать аналогичную функцию, предоставляемую другими веб-серверами? –

+0

Если у вас нет доступа к htaccess или mod rewrite, вы должны рассмотреть возможность переключения хостов. Если это не причина этого вопроса, не могли бы вы объяснить, почему вы хотите это сделать? –

+1

Я отредактировал свой ответ в ответ на ваш вопрос – Martijn

ответ

2

Вы можете использовать взрываются, чтобы получить детали из вашего массива:

$path = trim($array['path'], "/"); // trim the path of slashes 
$path = explode("/", $path); 
unset($path[0]); // the first one is the file, the others are sections of the url 

Если вы действительно хотите, чтобы сделать его zerobased снова, добавьте в последнюю строку:

$patch = array_values($path); 

В ответ на ваше изменение:
Вы хотите сделать это как можно более гибким, поэтому нет фиксированного кодирования, рассчитанного на максимум 5 предметов. Хотя вы, вероятно, никогда не превзойдете этого, просто не привязывайтесь к нему, просто накладные расходы вам не нужны.

Если у вас есть система страницы, как это:

id parent name    url 
1 -1  Foo     foo 
2 1  Bar, child of Foo bar-child-of-foo 

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

SELECT * FROM pages WHERE parent=-1 AND url=$path[0] 

Этот запрос возвращает идентификатор, используйте, что в родительской колонке со следующим значением массива. Отсоедините каждое найденное значение массива $ path. В конце концов, у вас будет массив с оставшимися частями.

Чтобы создать эскиз пример:

function GetFullPath(&$path, $parent=-1){ 
    $path = "/"; // start with a slash 
    // Make the query for childs of this item 
    $result = mysqli_query($conn, "SELECT * FROM pages WHERE parent=".$parent." AND url=".current($path)." LIMIT 1"); 
    // If any rows exists, append more of the url via recursiveness: 
    if($result->num_rows!==0){ 
     // Remove the first part so if we go one deeper we start with the next value 
     $path = array_slice($patch,1); // remove first value 
     $fetch = $result->fetch_assoc(); 
     // Use the fetched value to go deeper, find a child with the current item as parent 
     $path.= GetFullPath($path, $fetch['parent']); 
    } 
    // Return the result. if nothing is found at all, the result will be "/", probs home 
    return $path; 
} 

echo GetFullPath($path); // I pass it by reference, any alterations in the function happen to the variable outside the scope aswell 

Это проект, я не проверял это, но вы получите идею им пытаются эскиз. Вы можете использовать тот же метод, чтобы получить идентификатор страницы, на которой вы находитесь. Просто продолжайте снова передавать переменную c

На днях я получаю рекурсивность ^^.
Редактировать снова: Ой, что оказалось совсем некоторым кодом.

Смежные вопросы