服务热线
1888888888
作者:文煞发布时间:2024-09-13分类:PHP笔记浏览:200
很多CMS系统都采用PHP程序与主题模板分离的方法来实现页面的高度自定义,我们通常只需要修改模板文件就可以达到一些想要的功能。在面对大量采集的内容,站长很难保证采集得来的文章内容全都干净合法,一不小心就会采集到一些乱七八糟的外部超链接,如果我们能在文章内容展示给用户之前,对文章内容进行处理,未尝不是一件美事。
对于市面常见的CMS系统可以修改文件或者使用插件的方法对文章内容进行处理,修改PHP文件的话可能会导致升级以后失效,建议使用插件的方式来进行处理,由于本人也不熟悉所有程序的插件钩子机制,所以这里无法使用完整的插件代码来进行展示。我们分享处理文章内容的核心功能代码吧:
<?php // 假设$content是从数据库或者某个地方获取的文章内容 $content = "<p>This is an example article with a link to Example Site.</p >"; // 正则表达式来匹配所有的超链接 $pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i'; // 检查是否存在外部链接 if (preg_match($pattern, $content, $matches)) { // 检查链接是否是外部链接 $url = $matches[1]; $domain = parse_url($url, PHP_URL_HOST); $current_domain = parse_url('http://'.$_SERVER['HTTP_HOST'], PHP_URL_HOST); if ($domain !== $current_domain) { // 替换所有的外部链接,添加JavaScript事件处理 $content = preg_replace($pattern, '<a href="$1" onclick="return confirmLink(this);">', $content); // 添加JavaScript代码 $content .= <<<JS <script> function confirmLink(link) { if (confirm('您即将跳转到外部链接,是否继续?')) { return; } else { event.preventDefault(); // 阻止链接默认行为 return false; } } </script> JS; } } // 输出处理后的文章内容 echo $content; ?>
这段PHP代码首先定义了一个正则表达式来匹配文章中的所有超链接。如果找到超链接,它会检查链接是否指向当前网站的外部。如果是外部链接,它将使用preg_replace函数将所有的<a>标签的onclick事件替换为一个自定义的confirmLink函数,这个函数会弹出一个确认对话框。
在PHP代码的最后,我们输出了处理后的文章内容,并在文章内容下方添加了JavaScript代码,该代码定义了confirmLink函数,用于在点击链接时显示确认对话框。当用户点击确认以后,才会进行跳转。这样利于外部内容的风险对你网站的影响以及阻止权重的流失。
以上代码可用于你在处理该类事件时,对修改和系统PHP文件或者设计插件的时候进行完善并使用。
我知道在dz和zblog在模板中都可以运行PHP代码,至于其他的CMS系统就不怎么了解了。
下面我以zblog为例吧,zblog文章内容页的模板文件是post-sing.php,你可以在该文件找到以下代码:{$article.Content},该代码就是输出对象$article->Content的意思。
我们可以修改第一部分代码来达到想要的效果,我们可以把{$article.Content}替换为如下代码:
{php} // 假设$content是从数据库或者某个地方获取的文章内容 $content = $article->Content; // 正则表达式来匹配所有的超链接 $pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i'; // 检查是否存在外部链接 if (preg_match($pattern, $content, $matches)) { // 检查链接是否是外部链接 $url = $matches[1]; $domain = parse_url($url, PHP_URL_HOST); $current_domain = parse_url('http://'.$_SERVER['HTTP_HOST'], PHP_URL_HOST); if ($domain !== $current_domain) { // 替换所有的外部链接,添加JavaScript事件处理 $content = preg_replace($pattern, '<a href="$1" onclick="return confirmLink(this);">', $content); // 添加JavaScript代码 $content .= <<<JS <script> function confirmLink(link) { if (confirm('您即将跳转到外部链接,是否继续?')) { return; } else { event.preventDefault(); // 阻止链接默认行为 return false; } } </script> JS; } } // 输出处理后的文章内容 echo $content; {/php}
在zblog的模板文件中,PHP代码放在{php}和{/php}之间,就可以运行模板文件中的PHP代码了。其他CMS系统可能有差异,需要你根据自己使用的内容管理系统来进行优化。
在一、二段文字中,我们介绍了外部链接提示处理的基础功能,我们下面可以进行进一步深化处理,比如设置允许跳转的域名则通过JS来进行跳转。
<?php // 示例文章内容 $content = "这是一段内容非常丰富的文章内容"; // 使用正则表达式匹配所有的超链接 $pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i'; // 检测文章中是否含有超链接,并获取所有匹配项 if (preg_match_all($pattern, $content, $matches)) { // 获取所有匹配到的超链接 $urls = $matches[1]; // 遍历所有匹配到的超链接,并替换它们 foreach ($urls as $index => $url) { // 创建新的URL格式 $newUrl = "go.php?url=" . urlencode($url); // 替换文章中的原始URL $content = str_replace($url, $newUrl, $content); } } // 输出处理后的文章内容 echo $content; ?>
这代段代码把原文章中的超链接的URL全部替换为go.php?url=原URL的格式,然后通过中间页来进行处理。中间页(go.php)的代码:
<?php // go.php $redirect_url = isset($_GET['url']) ? $_GET['url'] : ''; // 从GET参数获取URL // 允许跳转的域名列表 $allowed_domains = ['www.bbb.com', 'www.ccc.com']; // 检查URL格式是否正确 if (!filter_var($redirect_url, FILTER_VALIDATE_URL)) { die('非法操作:URL格式不正确。'); } // 获取URL的主机名 $host = parse_url($redirect_url, PHP_URL_HOST); // 检查是否允许跳转的域名 if (!in_array($host, $allowed_domains)) { die('非法操作:不允许的域名。'); } // 安全措施:清理URL以防止XSS攻击 $redirect_url = filter_var($redirect_url, FILTER_SANITIZE_URL); // 跳转延迟时间(秒) $redirect_delay = 5; ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>页面跳转</title> <script> var countdown = <?php echo $redirect_delay; ?>; function updateCountdown() { countdown--; document.getElementById('countdown').innerText = '跳转中 (' + countdown + '秒)'; if (countdown <= 0) { window.location.href = '<?php echo $redirect_url; ?>'; } else { setTimeout(updateCountdown, 1000); } } </script> </head> <body> <div style="text-align: center; margin-top: 100px;"> <h1>即将跳转</h1> <p id="countdown">跳转中 (<?php echo $redirect_delay; ?>秒)</p> <p><a href="<?php echo $redirect_url; ?>">立即跳转</a></p> </div> <script> window.onload = function() { updateCountdown(); }; </script> </body> </html>
这段代码通抓取GET信息获取需要跳转的URL,然后判断是否运行跳转,如果属于运行跳转的URL,才会执行跳转的JS代码,否则会出现禁止跳转的相关提示词!
分享:
支付宝
微信