)#i",
create_function('$matches', 'return fixLink($matches[1]);'),
$str);
}
// receives a string that contains a link such as
// 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('#