PHP中的正则表达式,用于创建wiki样式的链接

时间:2011-09-20 14:22:51

标签: php regex

我正在开发一个网站,该网站将使用内部内容的维基链接,例如[[Page Name]]

我正在尝试编写一个正则表达式来实现这一目标,我已经把它变成一个链接并用短划线替换空格(这是我们的空间替代而不是下划线)但仅用于两个单词的页面名称

我可以为所有可能的单词编写一个单独的正则表达式(比如10个向下),但我确信必须采用更简洁的方法。

这就是我现在所拥有的:

$regex = "#[\[][\[]([^\s\]]*)[\s]([^\s\]]*)[\]][\]]#";
$description = preg_replace($regex,"<a href=\"/$1-$2\">$1 $2</a>",$description);

如果有人可以告诉我如何修改这个正则表达式,那么它适用于任何真正有用的单词。

2 个答案:

答案 0 :(得分:2)

您可以使用接受回调的preg_replace_callback()函数来处理替换字符串。您也可以在模式中使用lazy quantifiers,而不是在字符类中使用很多否定。

外部preg_replace_callback将提取匹配的文本并将其传递给回调函数,该函数将返回正确修改的版本。

$str = '[[Page Name with many words]]';

echo preg_replace_callback('/\[\[(.*?)\]\]/', 'parse_tags', $str);

function parse_tags($match) {
    $text = $match[1];
    $slug = preg_replace('/\s+/', '-', $text);
    return "<a href=\"$slug\">$text</a>";
}

答案 1 :(得分:1)

您应该使用回调函数进行替换(使用preg_replace_callback):

$str = preg_replace_callback('/\[\[([^\]]+)\]\]/', function($matches) {
    return '<a href="' . preg_replace('/\s+/', '-', $matches[1]) . '>' . $matches[1] . '</a>';
}, $str);