2010-06-21 40 views
1

我想用帶有鏈接的文本替換文本中的名稱。用鏈接替換文本中的名稱

$text = "text with names in it (John) and Jacob."; 
$namesArray("John", "John Plummer", "Jacob", etc...); 
$LinksArray("<a href='/john_plom'>%s</a>", "<a href='/john_plom'>%s</a>", "<a href='/jacob_d'>%s</a>", etc..); 
//%s shout stay the the same as the input of the $text. 

但如果有必要,可以改變數組。

我現在使用2個數組str_replace。像這樣$text = str_replace($namesArray, $linksArray, $text); ,但替換喊叫工作的名稱與「點」或「)」或類似的東西在結束或開始。我怎樣才能讓替換工作在這樣的文本上。

輸出喊是"text with names in it (<a.....>John</a>) and <a ....>Jacob</a>."

+0

那麼你想在雅各布中刪除一個點嗎? – serg 2010-06-21 21:13:41

+0

你的'$ namesArray'看起來像什麼? – jigfox 2010-06-21 21:15:16

+0

沒有輸出提示是「帶有名稱的文本(約翰)和Jacob」。 該數組看起來像$ namesArray(「John」,「John Plummer」,「Jacob」等); 鏈接數組是$ LinksArray(「%s」等)。 %s留言保持與$文本的輸入相同。 但如果有必要可以改變數組。 – Remi 2010-06-21 21:30:10

回答

1

這裏是一個名稱的例子中,你需要重複此爲您的陣列中的每個元素:

$name = "Jacob"; 
$url = "<a href='/jacob/'>$1</a>"; 
$text = preg_replace("/\b(".preg_quote($name, "/").")\b/", $url, $text); 
+0

thx,我仍然有一個問題,如果我把這個循環替換功能搜索是已經替換的文本,可以大量的東西了。 – Remi 2010-06-21 22:11:20

+0

你能提供一個例子嗎? – serg 2010-06-21 22:21:03

+0

嘗試按名稱長度對數組進行排序,並從最短開始。 – serg 2010-06-21 22:27:34

1

試着這麼做

$name = 'John'; 
$new_string = preg_replace('/[^ \t]?'.$name.'[^ \t]/', $link, $old_string); 

PHP的preg_replace函數接受混合模式和主題,換句話說,你可以提供這樣的模式的陣列和更換的數組。

0

尋找正則表達式。像preg_replace()

preg_replace('/\((' . implode('|', $names) . ')\)/', 'link_to_$1', $text); 

注意,該解決方案採用名稱數組,不只是一個名字。

+1

我吸吮正則表達式 – Remi 2010-06-21 21:37:09

1

完成,沒有正則表達式:

$text = "text with names in it (John) and Jacob."; 
$name_link = array("John" => "<a href='/john_plom'>", 
    "Jacob" => "<a href='/jacob'>"); 
foreach ($name_link as $name => $link) { 
    $tmp = explode($name, $text); 
    if (count($tmp) > 1) { 
    $newtext = array($tmp[0], $link, $name, "</a>",$tmp[1]); 
    $text = implode($newtext); 
    } 
} 
echo $text; 

鏈接將永遠爲每個給定的輸入更改,所以我不知道我是否理解你的問題。但我已經測試過這個,它對於給定的字符串有效。要擴展它,只需在$name_link陣列中添加更多條目。