2010-07-16 18 views
5

Ok, donc j'ai fait cette fonction qui fonctionne bien pour convertir la plupart des URLs comme pies.com ou www.cakes.com en une étiquette de lien réelle.aide avec regex - comment puis-je faire des urls non-suivre?

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;  
} 

Je voudrais mettre à jour cette fonction pour ajouter no-follow balises à des liens vers mes concurrents,

Je dois donc certains mots-clés (noms de concurrents) à nofollow par exemple si mon site était sur le point de cuisson je pourrais veulent:

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

est-il possible de mettre en œuvre cette if(contains x){ add y} dans mon regex?

Est-ce ce qu'on appelle un 'lookback'?

Répondre

2

est peut-être preg_replace_callback ce que vous cherchez:

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); 
+0

cela semble génial, mais je vais avoir du mal avec des personnages, il semble preg_replace_callback n'accepte pas le modificateur « e », il est donc maintenant capturer les 'n' forme '\ n' de nouvelles lignes? – Haroldo

+0

Pouvez-vous donner un exemple de votre chaîne d'entrée? Difficile à construire regexp aveugle :) –

+0

ah c'était mon erreur, j'étais double échapper les linebreaks, votre solution fonctionne de façon fantastique, et merci aussi à Marty pour son aide aussi – Haroldo