设计模式——像facebook一样实现php的好方法


design patterns - a good way to implent l.php like facebook?

什么是l.php

我猜。php是链接。php打开facebook。这是一个预重定向脚本。facebook上的每个链接都是过滤到link.php?=链接

我有一些想法。像
  1. 使渲染类或过滤输入正则表达式,找到一个www.link.com然后改变它像<a href="http://www.oursite.php?to=www.link.com">link</a>,问题是当我们有一些变化,如果我们改变的东西,那么我们所有的档案链接不会工作(假设我们把输入到数据库)。.

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

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

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

<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. 使用Javascript

我将使用PHP让页面内容通过一个过滤器运行,该过滤器使用regex来替换链接。

使用javascript意味着人们可以关闭它。PHP确保所有链接都被正确替换。

只是要记住,确保任何内部链接(如导航)保持不变。

有很多类型的regex可以找到url,你必须选择一个适合你需要的

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