Regexp:仅在特定上下文中替换

时间:2010-03-25 12:55:43

标签: php regex preg-replace

在文字中,我想将所有$word替换为[$word]($word)(在Markdown中创建一个链接),但前提是它不在链接中。例如:

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

应该成为

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

因此,我需要检查$ word是否介于[和]之间,只有在不是这种情况时才替换。

你能想到一个preg_replace命令吗?

2 个答案:

答案 0 :(得分:3)

这并不像你想象的那么简单。在许多情况下,之前的答案会失败。这里应该替换已经不在[]内的每个$字:

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

如果$ word包含特殊的正则表达式字符,您可能需要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

答案 1 :(得分:0)

我想

“〜$字(?!。*])〜”

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

e.g。

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