2010-07-21 2 views
0

У меня есть URL отформатирован следующим образом:Анализировать URL с помощью Regex PHP

http://www.example.com/detail/state-1/county-2/street-3

То, что я хотел бы сделать, это разобрать значения для состояния (1), окружные (2), и улица (3). Я мог бы сделать это, используя комбинацию substr(), strpos() и цикла. Но я думаю, что использование регулярного выражения будет быстрее, но я не уверен, что будет с моим регулярным выражением.

+0

Не существует ли функции разделения для php, например split ("/") [some number]? – Anders

+0

на самом деле explode() был бы самым быстрым способом, так как он не использует сопоставление регулярных выражений .... так как вы используете URL-адрес, который делится через/вы можете использовать explode ("/", substr ($ url, strlen («http://www.example.com/»), strlen ($ url))) и вернуть массив вещей –

ответ

3
$pieces = parse_url($input_url); 
$path = trim($pieces['path'], '/'); 
$segments = explode('/', $path); 

foreach($segments as $segment) { 
    $keyval = explode('-', $segment); 
    if(count($keyval) == 2) { 
     $key_to_val[$keyval[0]] = $keyval[1]; 
    } 
} 

/* 
$key_to_val: Array (
    [state] => 1, 
    [county] => 2, 
    [street] => 3 
) 
*/ 
+0

«Биты» называются сегментами. – Gumbo

+0

@Gumbo: имена переменных изменяются по запросу. : P – Amber

+0

Это потрясающее спасибо! – ashansky

2

Может просто сделать это:

<?php 

$url = "http://www.example.com/detail/state-1/county-2/street-3"; 
list(, $state, $country, $street) = explode('/', parse_url($url, PHP_URL_PATH)); 

?> 
0
if (preg_match_all('#([a-z0-9_]*)-(\\d+)#i', $url, $matches, PREG_SET_ORDER)) { 
    $matches = array(
     array(
      'state-1', 
      'state', 
      '1', 
     ), 
     array(
      'county-2', 
      'county', 
      '2', 
     ), 
     array(
      'street-3', 
      'street', 
      '3', 
     ) 
    ); 

}

Обратите внимание, что это структура $matches массива (что это будет выглядеть, если вы var_dump «d это .. .

0

Этот шаблон регулярного выражения должен работать:

$subject = 'http://www.example.com/detail/state-1/county-2/street-3'; 
$pattern = 'state-(\\d+)/county-(\\d+)/street-(\\d+)'; 

preg_match($pattern, $subject, $matches); 
// matches[1],[2],[3] now stores (the values) 1,2,3 (respectively) 

print_r($matches); 
+0

Вы не имеете в виду 'matches [1], [2], [3] сейчас хранит 1,2,3'? Помните, что '[0]' всегда совпадает с полным шаблоном ... – ircmaxell