2013-07-31 4 views
1

У меня есть URL-адрес, для которого я хочу, чтобы соответствовать определенному шаблонуRegex матч все после

/События/дисплей/ID/признакам

где

  • матч все после того, как/события/
  • дисплей сопоставлен с ключом
  • id и признакам имеют 1 или более соответствует в ключевой

, таким образом, я в конечном итоге с

Array (
[method] => display 
[param] => Array ([0]=>id,[1]=>featured,[2]=>true /* if there was another path */) 
) 

до сих пор у меня есть

(?:/events/)/(?P<method>.*?)/(?P<parameter>.*?)([^/].*?) 

но не работает так, как ожидалось.

Что случилось с синтаксисом?

P.S. Нет, я не хочу использовать parse_url() или PHP определенные функции мне нужно регулярное выражение

+2

У вас есть дополнительные/после событий: Он ищет/событий // метод – JDiPierro

ответ

2

Вы можете использовать этот шаблон:

<pre><?php 
$subject = '/events/display/id1/param1/id2/param2/id3/param3'; 

$pattern = '~/events/(?<method>[^/]++)|\G/(?<id>[^/]++)/(?<param>[^/]++)~'; 

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 

foreach($matches as $match) { 
    if (empty($match['method'])) { 
     $keyval[] = array('id'=>$match['id'], 'param'=>$match['param']); 
    } else { 
     $result['method'] = $match['method']; 
    } 
} 
if (isset($keyval)) $result['param'] = $keyval; 
print_r($result); 

описание товара:

~ 
/events/(?<method>[^/]++) # "events" followed by the method name 
|       # OR 
\G       # a contiguous match from the precedent 
/(?<id>[^/]++)    # id 
/(?<param>[^/]++)   # param 
~ 
+0

Новые правила связи на SO сказать, что я не должен делать это, но тем не менее , Я: +1 приятное решение! :) – hek2mgl

+0

@ hek2mgl: Спасибо! Я никому не скажу. –

2

Почему не используется смесь preg_match() и explode():

$str = '/events/display/id/featured'; 
$pattern = '~/events/(?P<method>.*?)/(?P<parameter>.*)~'; 
preg_match($pattern, $str, $matches); 

// explode the params by '/' 
$matches['parameter'] = explode('/', $matches['parameter']); 
var_dump($matches); 

Выход:

array(5) { 
    [0] => 
    string(27) "/events/display/id/featured" 
    'method' => 
    string(7) "display" 
    [1] => 
    string(7) "display" 
    'parameter' => 
    array(2) { 
    [0] => 
    string(2) "id" 
    [1] => 
    string(8) "featured" 
    } 
    [2] => 
    string(11) "id/featured" 
} 
0

Здесь я в основном с помощью preg_match_all() воссоздать функциональность, аналогичную explode(). Затем я переназначаю результаты на новый массив. К сожалению, это нельзя сделать только с помощью Regex.

<?php 

$url = '/events/display/id/featured/something-else'; 
if(preg_match('!^/events!',$url)){ 
    $pattern = '!(?<=/)[^/]+!'; 
    $m = preg_match_all($pattern,$url,$matches); 

    $results = array(); 

    foreach($matches[0] as $key=>$value){ 
     if($key==1){ 
      $results['method']=$value; 
     } elseif(!empty($key)) { 
      $results['param'][]=$value; 
     } 
    } 
} 

print_r($results); 

?> 

Выход

Array 
(
    [method] => display 
    [param] => Array 
     (
      [0] => id 
      [1] => featured 
      [2] => something-else 
     ) 

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