Регулярные выражения - парсинг URL - PullRequest
0 голосов
/ 24 июля 2010

Один из первых раз я углубился в регулярные выражения, чтобы разобрать URL.Не вдаваясь в подробности, я в основном хочу дружественные URL-адреса и сохраняю каждую постоянную ссылку в базе данных, но из-за различий в языках и страницах я хочу сохранить только одну постоянную ссылку и проанализировать URL-адрес для страницы и языка.Поэтому, если я получаю что-то вроде этого:

http://domain.com/lang/fr/category/9/category_title/page/3.html

Все, что я действительно хочу, это бит "category / 9 / category_title", чтобы знать, на какой странице я нахожусь.Я придумал эту функцию:

$return = array();

$string = 'http://domain.com/lang/fr/category/9/category_title/page/3.html';

//Remove domain and http
$string = preg_replace('@^(?:http://)?([^/]+)@i','',$string);

if(preg_match('/^\/lang\/([a-z]{2})/',$string,$langMatches)) {
 $return['lang'] = $langMatches[1];
 //Remove lang
 $string = preg_replace('/^\/lang\/[a-z{2}]+/','',$string);
} else {
 $return['lang'] = 'en';
}

//Get extension
$bits = explode(".", strtolower($string));
$return['extension'] = end($bits);

//Remove extension
$string = preg_replace('/\.[^.]+$/','',$string);

if(preg_match('/page\/([1-9+])$/',$string,$pageMatches)) {
 $return['page'] = $pageMatches[1];
 //Remove lang
 $string = preg_replace('/page\/[1-9+]$/','',$string);
} else {
 $return['page'] = 1;
}

//Remove additional slashes from beginning and end
$string = preg_replace('#^(/?)|(/?)$#', '', $string);

$return['permalink'] = $string;

print_r($return);

, которая возвращает это из приведенного выше примера:

Array
(
    [lang] => fr
    [extension] => html
    [page] => 3
    [permalink] => category/9/category_title
)

Это идеально и именно то, что я хочу.Однако мой вопрос заключается в том, правильно ли я использовал регулярные выражения?Есть ли лучший способ, которым я мог бы сделать это, например, я мог бы удалить домен, расширение и дополнительные косые черты в начале и конце только одним выражением удара задницы?

Ответы [ 3 ]

2 голосов
/ 24 июля 2010

Вы должны использовать parse_url, чтобы разбить URL на его компоненты. И при наличии URL-пути вы можете использовать explode для разделения пути на сегменты, array_slice для получения определенных сегментов и pathinfo чтобы получить расширение.

0 голосов
/ 24 июля 2010

Выражение ниже, надеюсь, не зависит от языка программирования.

^.*?\\.[^/]+/[^/]+/([^/]+)/([^/]+/[^/]+/[^/]+)/.*(\\d+)\\.(\\w+).*$

Позвольте мне объяснить, что это делает.

Я использую всю строку (привязанную к ^ и $) и работаю вначале к последнему '.'персонаж в домене.Оттуда я использую последний элемент домена и первый элемент пути вместе с символами разделителя '/', которые следуют за каждым элементом, затем я использую группы захвата, чтобы захватить поле языка, и следующие три элемента сегмента пути затем отбрасываемв начало имени файла и используйте еще две группы для захвата имени файла и расширения, отбрасывающего пробелы, если таковые имеются, до конца строки.

Предупреждение, я провел минимальное тестирование выражениявыше, но верьте, что он может обрабатывать большинство URL, состоящих из символов в диапазоне ASCII.Он также очень специфичен для структуры URL-адреса и не обрабатывает URL-адреса более чем на одной строке.

0 голосов
/ 24 июля 2010

PHP имеет функцию parse_url .

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

...