2011-04-19 100 views
0

什么是l.php一个很好的方式来实现l.php像Facebook一样?

即时猜测l.php是 Facebook的link.php。其预先重定向脚本 。 Facebook上的每一个链接都是 已过滤到link.php?到=链接

我有一些想法。像

  1. 进行渲染类或正则表达式过滤输入,发现一个www.link.com然后将其更改为类似<a href="http://www.oursite.php?to=www.link.com">link</a>,问题是,当我们有一些变化,如果我们改变一些东西,然后我们所有的档案链接都不起作用(假设我们把输入放到数据库中)。

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

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

回答

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. 去通过对每一个部分的现场输出链接到外部网站,并使用DOMDocument的帮助下通过build_link功能他们重新写

  2. 重写

  3. 使用JavaScript
+0

谢谢!!!!,什么你建议吗? DOM文档的缺点?像RAM的使用?如果有选择权的赞成和反对会更好。 – 2011-04-19 14:54:23

+1

我还没有做任何测试以查看DOMDocument的性能,您可能想自己测试一下,看看它是否太重。这对于简单的事情可能有点沉重,所以如果你想要使用正则表达式路由,你可以执行'preg_replace('| ] +)| i','http://www.oursite.php?to = $ 1',$ html);' – 2011-04-19 15:53:56

0

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

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

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

有许多类型的正则表达式,用于查找网址,然后你必须选择一个适合您的需求

编辑:真正伟大的答案,但是我会用这个表达式(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)