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

一个像facebook一样实现l.php的好方法?,php,design-patterns,Php,Design Patterns,什么是l.php 我猜l.php正在运行link.php 脸谱网。这是一个预重定向 剧本facebook上的每个链接都是 过滤到link.php?到=link 我有一些想法。像 创建一个渲染类或使用正则表达式过滤输入,找到一个www.link.com,然后将其更改为类似于,问题是当我们有一些更改时,如果我们更改了某些内容,那么所有存档链接都将不起作用(假设我们将输入放入数据库) 使用JavaScript来实现这一点,我是说是的,但我不熟悉js,但我知道我们可以像上面那样实时搜索和更改链接。但问题

什么是l.php

我猜l.php正在运行link.php 脸谱网。这是一个预重定向 剧本facebook上的每个链接都是 过滤到link.php?到=link

我有一些想法。像

  • 创建一个渲染类或使用正则表达式过滤输入,找到一个www.link.com,然后将其更改为类似于
    ,问题是当我们有一些更改时,如果我们更改了某些内容,那么所有存档链接都将不起作用(假设我们将输入放入数据库)

  • 使用JavaScript来实现这一点,我是说是的,但我不熟悉js,但我知道我们可以像上面那样实时搜索和更改链接。但问题是当用户没有js时,(移动设备,或者没有JavaScript插件,等等)


  • 或者您可能有更好的答案我们植入l.php的最佳方式是什么?

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

    <a href="<?= build_link('www.link.com'); ?>">link text</a>
    
    这意味着您甚至可以在链接中轻松使用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();
    
    因此,这里有三种选择:

  • 检查站点上输出到外部站点链接的每个部分,并通过
    build\u link
    功能重新编写它们

  • 使用
    DOMDocument

  • 使用Javascript

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

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

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

    有许多类型的正则表达式可以查找URL,您必须选择一种适合您需要的正则表达式


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

    谢谢!!!!,非常好的答案,但是,你有什么建议?域名有什么缺点吗?比如ram的使用?如果选项有正反两方面的话会更好。我还没有做任何测试来查看DOMDocument的性能,您可能想自己测试一下,看看它是否太重。不过,对于这么简单的东西来说,它可能有点重,所以如果您想使用正则表达式,您可以只执行
    preg_替换(
    preg_replace”)|
    
    $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();