2010-07-16 11 views
5

Ok, he hecho esta función que funciona bien para convertir la mayoría de las URL como pies.com o www.cakes.com a una etiqueta de enlace real.help with regex - ¿Cómo puedo hacer que algunas URL no sigan?

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

me gustaría actualizar esta función para añadir no-follow etiquetas de enlaces a mis competidores,

por lo que tendría ciertas palabras clave (nombres de los competidores) para nofollow por ejemplo, si mi sitio estaba a punto de hornear yo podría desee:

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

es posible la implementación de esta if(contains x){ add y} en mi expresión regular?

¿esto es lo que se llama 'lookback'?

Respuesta

2

Tal preg_replace_callback es lo que busca:

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

esto se ve muy bien, sin embargo estoy teniendo problemas con caracteres, parece preg_replace_callback no acepta el modificador 'e', ​​por lo que ahora es la captura de la 'n' formar '\ n' nuevas líneas? – Haroldo

+0

¿Puede proporcionar un ejemplo de su cadena de entrada? Difícil de construir la expresión regular a ciegas :) –

+0

ah fue mi error, estaba escapando dos veces de los saltos de línea, su solución funciona fantásticamente, y gracias también a Marty por su ayuda también – Haroldo

Cuestiones relacionadas