2014-02-03 9 views
0

Я создаю класс «get all site links» в моем приложении. Функциональные параметры являются сегментами и возвращаются в качестве URL-адреса веб-сайта.Как заменить пользовательские строки на область Regex

Моих regexs, которые хранятся в базе данных, как этот blog/([a-z]+)(/[a-z0-9.-]+)?

Я хочу, чтобы заменить regexs с моими «совпадающими» данными (сегментами).

Сегменты являются строками или массивами, могут быть оба. Но предпочитаемое с использованием в качестве матрицы

Пример 1:

Regex: blog/([a-z]+)(/[a-z0-9.-]+)?

Сегменты: news, new-software-released

Результат: blog/news/new-software-released

Пример 2:

Regex: blog/([a-z]+)(/[a-z0-9.-]+)?

Сегменты: news

Результат: blog/news

Пример 3:

Regex: user(/[a-z0-9.-]+)?

Сегменты: johndoe

Результат: user/johndoe

Пробовал массив preg_replace, но я не мог понять:

function get_url($segments){ 
    $regex = "blog/([a-z]+)(/[a-z0-9.-]+)?" 
    $replacements = explode('|', trim($segments)); 
    $count = 0; 
    return preg_replace('/'.$regex.'/', '$replacements[$count++]', $regex); 
} 

echo get_url('news|new-software-released'); 
+0

Похоже, вам нужно заменить '|' на '/' в параметре и _concatenate_ с помощью 'blog /'? – devnull

+0

Почему вы используете '$ regex' как регулярное выражение и предмет замены? – Barmar

+0

Как вы можете сделать пример 3, когда у вас есть 'blog /' жестко закодированный в вашей функции? Он никогда не вернет 'user /'. – Barmar

ответ

1

Я до сих пор не действительно понимаете, что вы делаете, но похоже, что это будет делать то, что вам нужно:

function get_url($prefix, $segments) { 
    return $prefix . '/' . implode('/', explode('|', $segments)); 
} 

echo get_url('blog', 'news|new-software-released'); 
echo get_url('blog', 'news'); 
echo get_url('user', 'johndoe'); 
+0

Смысл! Но что, если регулярное выражение похоже на 'another/(regex) - (regex)/view' Но кажется очень сложно иметь такой url like;) – Bora

+2

Вы пытаетесь использовать регулярное выражение как шаблон для того, как построить URL-адрес из сегментов? – Barmar

+0

Абсолютно это то, что я хочу! Я думаю, не мог сказать, что хочу. – Bora

0

Он хорошо работает:

<?PHP 
function get_url($segments){ 
    $regex = "blog/([a-z]+)(/[a-z0-9.-]+)?"; 
    $url = "blog/test"; 
    $replacements = explode('|', trim($segments)); 
    if(count($replacements) > 1) $replacements = 'blog/' . $replacements[0] . '/' . $replacements[1]; 
    else $replacements = 'blog/' . $replacements[0]; 
    $count = 0; 
    return preg_replace('#'.$regex.'#', $replacements, $url); 
} 

echo get_url('news|new-software-released'); 

То возвращаемое значение blog/news/new-software-released

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