洋芋笔记

Typecho 实现内容外链新标签打开

演示

站内链接:首页(使用相对路径 /)
站内链接:首页(使用绝对网址 https://blog.0112233.xyz/
站外链接:百度

我使用的Typecho版本:v1.2.1

实现

在主题的functions.php中加入

function parseContent($obj) {
    $options = Typecho_Widget::widget('Widget_Options');
    $siteUrl = $options->siteUrl; // 获取站点的基础 URL

    // 使用 preg_replace_callback 来检查并修改链接
    $obj->content = preg_replace_callback(
        '/<a href="([^"]+)">/i', // 匹配所有的 <a href="..."> 标签
        function ($matches) use ($siteUrl) {
            $url = $matches[1];
            // 检查 URL 是否为绝对 URL 或者是否包含站点的基础 URL
            if (strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0 && strpos($url, $siteUrl) === false) {
                // 如果是相对路径并且不含站点 URL,视为站内链接,不添加 target="_blank"
                return "<a href=\"$url\">";
            } else if (strpos($url, $siteUrl) === false) {
                // 如果是绝对路径且不是站内链接,添加 target="_blank"
                return "<a href=\"$url\" target=\"_blank\">";
            } else {
                // 站内链接,不添加 target="_blank"
                return "<a href=\"$url\">";
            }
        },
        $obj->content
    );

    echo trim($obj->content);
}

假设您的主题在展示文章内容时使用了类似这样的代码:

<?php echo $this->content; ?>

您可以将其修改为调用 parseContent 函数:

<?php parseContent($this); ?>

即可实现内部链接当前标签页打开,外部链接新标签页打开。

#Typecho