2015-07-11 58 views
3

我查找了一些參考,如this questionthis question,但無法弄清楚我需要做什麼。PHP匹配字符串模式並獲取變量

我所試圖做的是:

說,我有兩個字符串:

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

現在我要檢查,如果這個模式匹配。如果他們匹配,我想把國家的價值設定爲美國。

$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; 

更新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));