PHP preg_replace: sustitución de enlaces de Youtube sobre sustitución de URL

en mi sitio web tengo tres expresiones regulares (una está deshabilitada y entenderás por qué...) para sustituir lo que publican los usuarios:

1° Reemplace el correo electrónico con los vinculados:

$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>",$string);

2° Reemplace el enlace de Youtube con video incrustado:

$pattern = '/http:\/\/www\.youtube\.com\/watch\?(.*?)v=([a-zA-Z0-9_\-]+)(\S*)/i';
$replace = '<iframe title="YouTube" class="youtube" type="text/html" width="320" height="240" src="http://www.youtube.com/embed/$2" frameborder="0" allowFullScreen></iframe>';
$string = preg_replace($pattern, $replace, $string);

3° Reemplazar enlaces con enlaces (¡estos están deshabilitados!):

 /*** make sure there is an http:// on all URLs ***/
$string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string);
/*** make all URLs links ***/
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>",$string);

Mi problema es que, obviamente, el tercero sustituye los enlaces de youtube después de que son reemplazados por expresiones regulares anteriores (cambiar de secuencia, romper videos de youtube)

¿Cómo habilitar la tercera expresión regular para sustituir las URL ignorando el patrón de YouTube? Gracias ;-)

preguntado el 03 de mayo de 12 a las 18:05

1 Respuestas

Prueba esto:

// youtube
$string = preg_replace("/\s*[a-zA-Z\/\/:\.]*youtube.com\/watch\?v=([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i"," <object width=\"100%\" height=\"344\"><param name=\"movie\" value=\"http://www.youtube.com/v/$1&hl=en&fs=1\"></param><param name=\"allowFullScreen\" value=\"true\"></param><embed src=\"http://www.youtube.com/v/$1&hl=en&fs=1\" type=\"application/x-shockwave-flash\" allowfullscreen=\"true\" width=\"100%\" height=\"450\"></embed></object>  ",$string);

// email
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>", $string);

// links
$string = preg_replace("#(^|[\n\s>])([\w]+?://[^\s\"\n\r\t<]*)#is", "\\1<a href=\"\\2\">\\2</a>", $string);

contestado el 03 de mayo de 12 a las 19:05

¡¡Perfecto!! El único problema es que no sustituye las direcciones URL que comienzan sin http:// - Giuseppe Donato

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.