2011-02-04 2 views
0

У меня есть следующая структура URL, который я должен соответствовать, чтобы и получить конкретный идентификатор из:Regular Expression проблема

/group/subgroup/id-name 

Короче говоря, мне нужно перевести URL вроде следующего:

/Blue Products/Dark Blue/5-Blue_Jelly 

To:

/?pagename=Blue Products&model=5 

ВАЖНО: мне не нужно, чтобы соответствовать group, у меня уже есть группа.

Пример кода:

<?php 

    foreach($cats as $cat) 
     $cmd->rewrite('/\/'.$cat.'\/unused\/(ID)-unused\//','/?pagename='.$cat.'&model=%ID%'); 

?> 

Edit:

Это завершенная код:

if($groups->count()){ 

     $names=array(); 
     foreach($groups->rows as $row) 
      $names[]=preg_quote($row->group); 
     $names=implode('|',$names); 

     $regex='('.$names.')/([^/]+)/([0-9]{1,})-([^/]+)/?$'; 

     CmsHost::cms()->rewrite_url($regex,'index.php?pagename=Products',true); 
    } 
+0

Не слишком ли избыточное выражение для этого ... Почему бы просто не взорвать строку «url string» в /, а затем просто посмотреть на отдельные элементы результирующего массива? –

+0

@Mark Baker - я стараюсь избегать regexp любой ценой, но в этом случае этот метод перезаписи принимает только регулярное выражение. – Christian

ответ

2

Вы можете использовать \d+ для соответствия d ecimals.

$cmd->rewrite("#/$cat/.+?/(\d+)-.*?/#', ... 

Использование # в качестве внешних ограничителей, чтобы избежать посторонние вытекания из \/

+0

Ах, хорошая точка, она на самом деле десятичная. – Christian

1

Зачем использовать регулярное выражение, когда вы можете использовать простые строковые функции, как так :

$parts = explode('/', trim('/Blue Products/Dark Blue/5-Blue_Jelly', '/')); 
list($group, $subgroup, $id_name) = $parts; 
+0

Согласен, но он пытается получить идентификатор, тогда как это даст ему идентификационное имя, которое, по общему признанию, не является огромным препятствием для преодоления. :) –

+0

Простая строковая функция для этого будет 'strtok' или' strrchr'. Использование 'explode' для целей микро оптимизации менее устойчиво к неверным форматам, и вот забавный факт: * медленнее * из-за метода обхода массива. – mario

+0

То же, что я ответил мистеру Бейкеру выше; регулярное выражение выполняет две цели: ** 1 ** проверить, соответствует ли URL моему шаблону и ** 2 ** (необязательно) найти части, которые мне нужны для формирования нового URL-адреса. – Christian

1

Попробуйте это:

$url = preg_replace("'/".$cat."/[^/]+/([0-9]+)-.*'i","/?pagename=".$cat."&model=\\1",$url); 

Надеется, что это работает!

+0

Спасибо, попробуй! – Christian