2015-07-11 2 views
3

Я искал некоторые ссылки, такие как this question и this question, но не мог понять, что мне нужно сделать.PHP Match String Pattern и Get Variable

То, что я пытаюсь сделать, это:

Скажем, у меня есть две строки:

$str1 = "link/usa"; 
$str2 = "link/{country}"; 

Теперь я хочу, чтобы проверить, если это шаблон совпадает. Если они совпадают, я хочу, чтобы значение страны было установлено в usa.

$country = "usa"; 

Я также хочу работать в тех случаях, как:

$str1 = "link/usa/texas"; 
$str2 = "link/{country}/{place}"; 

Может быть целыми числами, а также. Подобно сочетанию всех фигурных скобок и присваиваем переменной значение. (И, если возможно, более высокая производительность, если это возможно)

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

ответ

6

Это даст вам результаты, как ожидается,

$str1 = "link/usa"; 
$str2 = "link/{country}"; 

if(preg_match('~link/([a-z]+)~i', $str1, $matches1) && preg_match('~link/{([a-z]+)}~i', $str2, $matches2)){ 
    $$matches2[1] = $matches1[1]; 
    echo $country; 
} 

Примечание: Приведенный выше код будет просто разобрать алфавитов, вы можете расширить символы в диапазоне, в соответствии с необходимостью.

UPDATE:

Вы также можете сделать это с помощью explode, смотрите пример ниже:

$val1 = explode('/', $str1); 
$val2 = explode('/', $str2); 
${rtrim(ltrim($val2[1],'{'), '}')} = $val1[1]; 
echo $country; 

UPDATE 2

$str1 = "link/usa/texas/2/"; 
$str2 = "/link/{country}/{city}/{page}"; 

if(preg_match_all('~/([a-z0-9]+)~i', $str1, $matches1) && preg_match_all('~{([a-z]+)}~i', $str2, $matches2)){ 

    foreach($matches2[1] as $key => $matches){ 
     $$matches = $matches1[1][$key]; 
    } 
    echo $country; 
    echo '<br>'; 
    echo $city; 
    echo '<br>'; 
    echo $page; 
} 
+0

Как насчет производительности? Могу ли я зависеть от этого цикла, может быть, сто раз? – tika

+0

сто раз, нечего делать, попробуйте –

+1

@tika вы также можете сделать это с помощью 'explode', если вы хотите избежать регулярного выражения, см. Мой обновленный ответ –

2

Я не вижу смысла в используйте ключ как имя переменной, если вы можете построить ассоциативный массив, который, вероятно, будет более удобно использовать позже, и избегает писать уродливые динамические имена переменных ${the_name_of_the_var_${of_my_var_${of_your_var}}}:

$str1 = "link/usa/texas"; 
$str2 = "link/{country}/{place}"; 

function combine($pattern, $values) { 
    $keys = array_map(function ($i) { return trim($i, '{}'); }, 
         explode('/', $pattern)); 
    $values = explode('/', $values); 

    if (array_shift($keys) == array_shift($values) && count($keys) && 
     count($keys) == count($values)) 
     return array_combine($keys, $values); 
    else throw new Exception ("invalid format"); 
} 

print_r(combine($str2, $str1));