topical media & game development

talk show tell print

professional-search-08-seophp-include-nofollow.inc.php / php



  <?php
  
  // include config file
  require_once 'config.inc.php';
  
  // finds all the links in str and processes them using fixLink()
  function noFollowLinks(str) 
  { 
    // replaces every link with the version provided by fixLink() 
    return preg_replace_callback(
      "#(<a.*?>)#i", 
      create_function('matches', 'return fixLink(matches[1]);'),
      str);  
  } 
  
  // receives a string that contains a link such as <a href="http://too.much.spam/">
  // and adds the ref="nofollow" attribute if the domain isn't in the white list
  function fixLink(input)
  {
    // retrieve the whitelist from the config file
    whitelist = GLOBALS['whitelist'];
  
    // if the link in input already contains ref="nofollow", return it as it is
    if (preg_match('#rel\s*?=\s*?[\'"]?.*?nofollow.*?[\'"]?#i', input)) 
    {
      return input;   
    }
  
    // extract the URL from input
    preg_match('#href\s*?=\s*?[\'"]?([^\'"]*)[\'"]?#i', input, captures);
  
    // href will contain the extracted URL, such as http://seophp.example.com
    href = captures[1];
  
    // if URL doesn't contain http://, assume it's a local link
    if (!preg_match('#^\s*http://#', href))
    {
      return input;
    }
  
    // extract the host name of the URL, such as seophp.example.com
    parsed = parse_url(href);
    host = parsed['host'];
  
    // if the URL is in the whitelist, send input back as it is
    if (in_array(host, whitelist)) 
    {
      return input;
    } 
  
    // assuming the URL already has a rel attribute, change its value to nofollow
    x = preg_replace('#(rel\s*=\s*([\'"]?))((?(3)[^\'"]*|[^\'" ]*))([\'"]?)#i', 
                      '\\1\\3,nofollow\\4', input);
  
    // if the string has been modified, it means it already had a rel attribute,
    // whose value has been changed to nofollow, so we return the new version
    if (x != input) 
    {
      return x;
    } 
    // if the link in the input string doesn't have ref attribute, we add it
    else 
    {
      return preg_replace('#<a#i', '<a rel="nofollow"', input);
    }
  }
  
  ?>
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.