помочь с регулярным выражением - как я могу сделать некоторые URL-адреса не следовать? - PullRequest
5 голосов
/ 16 июля 2010

Хорошо, поэтому я сделал эту функцию, которая прекрасно работает для преобразования большинства URL, таких как pies.com или www.cakes.com, в фактический тег ссылки.

function render_hyperlinks($str){       
    $regex = '/(http:\/\/)?(www\.)?([a-zA-Z0-9\-_\.]+\.(com|co\.uk|org(\.uk)?|tv|biz|me)(\/[a-zA-Z0-9\-\._\?&=#\+;]+)*)/ie';    
    $str = preg_replace($regex,"'<a href=\"http://www.'.'$3'.'\" target=\"_blank\">'.strtolower('$3').'</a>'", $str);
    return $str;    
}

Я хотел бы обновить эту функциюдобавить no-follow теги к ссылкам на моих конкурентов,

, чтобы у меня были определенные ключевые слова (имена конкурентов), например nofollow, если мой сайт готовился к выпечке, я мог бы захотеть:

no-follow any sites with the phrases 'bakingbrothers', 'mrkipling', 'lyonscakes'

возможно ли реализовать это if(contains x){ add y} в моем регулярном выражении?

это то, что называется «оглядкой назад»?

1 Ответ

2 голосов
/ 16 июля 2010

Может быть, preg_replace_callback - это то, что вы ищете:

function link($matches)
{
    $str_return = '<a href="http://www.'.$matches[3].'" target="_blank"';
    if(in_array($matches[3], $no_follow_array))
    {
        $str_return .= ' no-follow';
    }
    $str_return .='>'.strtolower($matches[3]).'</a>';
}

$regex = '/(http:\/\/)?(www\.)?([a-zA-Z0-9\-_\.]+\.(com|co\.uk|org(\.uk)?|tv|biz|me)(\/[a-zA-Z0-9\-\._\?&=#\+;]+)*)/ie';    
$str = preg_replace_callback($regex,'link', $str);
...