像facebook一样实现a.php的好方法?

时间:2011-04-19 12:56:05

标签: php design-patterns

什么是l.php

  

我猜猜l.php是link.php   Facebook的。它是预先重定向的   脚本。 Facebook上的每个链接都是   过滤到link.php?到= link

我记住了一些事情。像

  1. 制作渲染类或使用正则表达式过滤输入,找到 www.link.com 然后将其更改为<a href="http://www.oursite.php?to=www.link.com">link</a>,问题是我们有什么更改,如果我们更改了某些内容,那么我们所有的归档链接都无法正常工作(假设我们将输入放入数据库中。)。

  2. 使用JavaScript来做到这一点,我的意思是,但我不熟悉js,但我知道我们可以像上面一样搜索和更改链接。但问题是用户没有js,(移动或没有JavaScript插件等)

  3. 或者你有更好的答案我们植入l.php的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

这将是使用函数在视图中生成链接的优点之一:

<a href="<?= build_link('www.link.com'); ?>">link text</a>

您的build_link()就是这样:

function build_link($path)
{
   $prefix = '';
   if (preg_match('|^(https?://|www\.)', $path))
   {
     $prefix = 'http://www.oursite.php?to=';
   }
   return $prefix . $path;
}

这意味着您甚至可以在链接中轻松使用CDN。

最简单的选择是使用Javascript,但是就像你说的那样依赖于用户使用支持Javascript的浏览器,这非常类似于浏览器技术的进步,即使在移动平台上也是如此。 jQuery看起来像这样:

$(document).ready(function() {

   $('a').live('click', function() {
     var href = $(this).attr('href');

     if (href.match(/^(https?:\/\/|www\\.)/i))
     {
         this.href = 'http://www.oursite.php?to=' + href;
     }

       return this.href;
   });
});

如果更改链接不可行,即您需要重写数据库或类似内容中的链接,我会考虑使用DOMDocument - 在处理复杂结构时避免混乱的正则表达式通常是一种好习惯例如HTML

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($text);
$anchors = $doc->getElementsByTagName('a');

foreach($anchors as $a) {
   $href = $a->getAttribute('href');
   if (preg_match('|^(https?://|www\.)', $href))
   {
      $a->setAttribute('href', 'http://www.oursite.php?to=' . $href);
   }
}

$newHTML = $doc->saveHTML();

所以这里有三个选项:

  1. 浏览网站上输出外部网站链接的每个部分,然后通过build_link函数重新编写

  2. 使用DOMDocument

  3. 的帮助重写
  4. 使用Javascript

答案 1 :(得分:0)

我会使用PHP来让页面内容通过使用正则表达式替换链接的过滤器运行。

使用javascript意味着paople可以将其关闭。 PHP确保正确替换所有链接。

请记住确保任何内部链接(如导航)都保持不变。

有许多类型的正则表达式可以找到网址,您必须选择一个适合您需要的网址

编辑:我会使用此正则表达式(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)