2010-03-25 76 views
2

在文本中,我想用[$word]($word)(在Markdown中創建鏈接)替換所有出現的$word,但前提條件是它尚不在鏈接中。例如:正則表達式:僅在特定上下文中替換

[$word homepage](http://w00tw00t.org)

應該成爲

[[$word]($word) homepage](http://w00tw00t.org)

因此,我需要檢查$ word是否介於[和]之間,並且只有在不是這種情況纔會被替換。

你能想到一個preg_replace命令嗎?

回答

3

這並不像您想象的那麼簡單。以前的答案在很多情況下都會失敗。這裏有一個應該替換每$字,這不是裏面[早已]:

$text = preg_replace('/\G((?:[^\[]|\[[^\]]*\])*?)('.$word.')/', '$1[$2]($2)', $text) 

如果$字包含特殊字符的正則表達式,你可能要preg_quote它。

$text = 'aa foo bb [foo bar](http://example.com) cc foo dd'; 
$word = 'foo'; 
$text = preg_replace('/\G((?:[^\[]|\[[^\]]*\])*?)('.$word.')/', '$1[$2]($2)', $text); 
echo $text; 

輸出:

aa [foo](foo) bb [foo bar](http://example.com) cc [foo](foo) dd

+0

即使'$ word'不包含特殊字符的正則表達式,你可能想'preg_quote()'它。只是因爲這是正確的事情。 – Tomalak 2010-03-25 15:21:59

0

我覺得

「〜$字(?!。*])〜」

"~$word(?=[^\[\]]*(\[|$))~" 

例如

$src = "aa foo [ bbb foo xyz ] cc foo dd"; 
$word = "foo"; 
print preg_replace("~$word(?=[^\[\]]*(\[|$))~", "[FOO](bar)", $src);