我正在开发一个网站,该网站将使用内部内容的维基链接,例如[[Page Name]]
我正在尝试编写一个正则表达式来实现这一目标,我已经把它变成一个链接并用短划线替换空格(这是我们的空间替代而不是下划线)但仅用于两个单词的页面名称
我可以为所有可能的单词编写一个单独的正则表达式(比如10个向下),但我确信必须采用更简洁的方法。
这就是我现在所拥有的:
$regex = "#[\[][\[]([^\s\]]*)[\s]([^\s\]]*)[\]][\]]#";
$description = preg_replace($regex,"<a href=\"/$1-$2\">$1 $2</a>",$description);
如果有人可以告诉我如何修改这个正则表达式,那么它适用于任何真正有用的单词。
答案 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);