PHP Regex на URL - разделить на переменные - PullRequest
0 голосов
/ 09 августа 2010

Я пытаюсь реализовать скрипт php, который будет запускаться при каждом обращении к моему сайту, искать определенный шаблон URL, затем взрывать URL и выполнять перенаправление.

В основном я хочу запустить этона новой CMS, чтобы перехватить все входящие ссылки со старой CMS и перенаправить, основываясь на сопоставлении, скажем, разделенный идентификатор статьи с URL-адреса на тот же идентификатор статьи, импортированный в базу данных новой CMS.

Я могу сделатьреализация, перенаправление и т. д., но я теряюсь в регулярном выражении.

Мне нужно отловить любые случаи:

domain.com/content/view/*/34/ или domain.com/content/view/*/30/ (где * - подстановочный знак) изахват * и 30 или 34 в переменной, которую я затем буду использовать в запросе к БД.

Если встречается следующее:

domain.com/content/view/*/34/1/*/

Мне нужно захватить первый *, а второй *.

Буду очень признателен всем, кто может мне помочь.

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

Я не уверен, что регулярные выражения - это то, что нужно. Я думаю, что, вероятно, было бы проще использовать explode ('/' , $url) и проверять, перебирая этот массив.

Вот шаги, за которыми я бы следовал:

$url = parse_url($url, PHP_URL_PATH); 
$url = trim($url, '/'); 
$parts = explode ('/' , $url); 

Тогда вы можете проверить, если

($parts[0]=='content' && $parts[1]=='view' && $parts[3]=='34')

Вы также можете легко получить нужную информацию с помощью $parts[2].

0 голосов
/ 10 августа 2010

Во-первых, я бы использовал PHP-функцию parse_url (), чтобы получить путь, без какого-либо протокола или имени хоста.

Как только вы получите следующий код, вы получите необходимую информацию.

<?php

$url = 'http://domain.com/content/view/*/34/'; // first example
$url = 'http://domain.com/content/view/*/34/1/*/'; // second example
$url_array = parse_url($url);

$path = $url_array['path'];

// Match the URL against regular expressions
if (preg_match('/content\/view\/([^\/]+)\/([0-9]+)\//i', $path, $matches)){        
        print_r($matches);
}

if (preg_match('/content\/view\/([^\/]+)\/([0-9]+)\/([0-9]+)\/([^\/]+)/i', $path, $matches)){        
        print_r($matches);
}

?>

([^ /] +) соответствует любой последовательности символов, кроме косой черты

([0-9] +) соответствует любой последовательности чисел

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

Также я рекомендую прочитать «Освоение регулярных выражений» от O'reilly.Хорошее знание регулярных выражений пригодится довольно часто.

http://www.regular -expressions.info / php.html

0 голосов
/ 09 августа 2010

На самом деле это очень просто, более гибкий и простой подход - explode() URL-адрес в массив, называемый чем-то вроде $segments, и затем тестирование там.Если у вас очень мало ожидаемых URL-адресов, такой подход, вероятно, проще поддерживать и читать.

Я бы не рекомендовал делать это в файле htaccess из-за снижения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...