2013-03-15 42 views
0

給定的字符串必須與此類似添加多個鏈接,分隔符

$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)'; 

@字符串表示標記的字存在,與類型和main_id。我的目標是鏈接標記的話是這樣的:

<a href="/user.php?id=529">@Carlos</a> is going to rock <a href="/city.php?id=111">@NEW YORK</a> 

一旦印刷它的外觀與卡洛斯和紐約鏈接如下

@Carlos是要搖滾@NEW YORK

使用substr_count我將能夠知道多少個標籤。我有一個函數來獲得兩個分隔符之間的字符串

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 

我被困在如何解決這個問題上,任何建議都會有所幫助。

+0

我會用正則表達式解決這個問題。 – 2013-03-15 15:08:21

+1

preg_replace()(http://www.php.net/manual/en/function.preg-replace.php)似乎是一個明顯的函數來處理一切函數調用 – 2013-03-15 15:09:28

回答

0

您的數據格式不錯,適合正則表達式。

我會用一個看起來像這樣:

/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/ 

這看起來爲@標誌,其次[<words>],然後接着({<word>}:<number>)

然後,您可以使用preg_replace一次性替換包含鏈接的字符串。

$string = '@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)'; 
$regex = '/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/'; 

$newString = preg_replace($regex, '<a href="/$2.php?id=$3">@$1</a>', $string); 

DEMO:http://ideone.com/EYf4KR

+0

完美明確,感謝快速回復和演示。非常感謝 – Mortage 2013-03-15 15:46:18

+0

不客氣!很高興我能幫上忙 :) – 2013-03-15 15:48:26

1

使用正則表達式(preg_match/preg_match_all/preg_replace)。示例代碼:

<?php 
$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)'; 

print preg_replace('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', '<a href="/\2.php?id=\3">@\1</a>', $string); 

?> 

但你可能想以做標記一些用htmlspecialchars(),爲了安全起見,使用preg_replace_callback。以及類型上的urlencode()。像這樣:

function tag2url($matches) { 
    $tag = $matches[1]; 
    $type = $matches[2]; 
    $id = $matches[3]; 
    return '<a href="/' . urlencode($type) . '.php?id=' . urlencode($id) . '">' . htmlspecialchars($tag) . '</a>'; 
} 

print preg_replace_callback('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', "tag2url", $string);