在文本中,我想用[$word]($word)
(在Markdown中創建鏈接)替換所有出現的$word
,但前提條件是它尚不在鏈接中。例如:正則表達式:僅在特定上下文中替換
[$word homepage](http://w00tw00t.org)
應該不成爲
[[$word]($word) homepage](http://w00tw00t.org)
。
因此,我需要檢查$ word是否介於[和]之間,並且只有在不是這種情況纔會被替換。
你能想到一個preg_replace命令嗎?
在文本中,我想用[$word]($word)
(在Markdown中創建鏈接)替換所有出現的$word
,但前提條件是它尚不在鏈接中。例如:正則表達式:僅在特定上下文中替換
[$word homepage](http://w00tw00t.org)
應該不成爲
[[$word]($word) homepage](http://w00tw00t.org)
。
因此,我需要檢查$ word是否介於[和]之間,並且只有在不是這種情況纔會被替換。
你能想到一個preg_replace命令嗎?
這並不像您想象的那麼簡單。以前的答案在很多情況下都會失敗。這裏有一個應該替換每$字,這不是裏面[早已]:
$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
我覺得
「〜$字(?!。*])〜」
"~$word(?=[^\[\]]*(\[|$))~"
例如
$src = "aa foo [ bbb foo xyz ] cc foo dd";
$word = "foo";
print preg_replace("~$word(?=[^\[\]]*(\[|$))~", "[FOO](bar)", $src);
即使'$ word'不包含特殊字符的正則表達式,你可能想'preg_quote()'它。只是因爲這是正確的事情。 – Tomalak 2010-03-25 15:21:59