Expresiones regulares para reemplazar condicionalmente hashtags de Twitter con hipervínculos
Pregunta
Estoy escribiendo un pequeño script PHP para agarrar las últimas actualizaciones de estado media docena de Twitter partir de una alimentación de usuario y darles formato para su visualización en una página web. Como parte de esto necesito una expresión regular en lugar de volver a escribir hashtags como hipervínculos a search.twitter.com. Al principio traté de usar:
<?php
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet);
?>
(tomado de https://gist.github.com/445729 )
En el transcurso de las pruebas descubrí que #test se convierte en un enlace en el sitio web de Twitter, sin embargo # 123 no es. Después de un poco de comprobar en el Internet y jugar con diversas etiquetas que llegué a la conclusión de que un hashtag debe contener caracteres alfabéticos o un guión bajo en algún lugar de constituir un enlace; etiquetas con sólo caracteres numéricos son ignorados (presumiblemente a las cosas de parada como "buena presentación Bob, diapositiva # 3 fue mi favorito!" de su vinculación). Esto hace que el código incorrecto, ya que estará feliz de convertir # 123 en un enlace.
No he hecho mucho de expresiones regulares en un rato, así que en mi rustyness me ocurrió con la siguiente solución PHP:
<?php
$test = 'This is a test tweet to see if #123 and #4 are not encoded but #test, #l33t and #8oo8s are.';
// Get all hashtags out into an array
if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) {
foreach ($arrHashtags[2] as $strHashtag) {
// Check each tag to see if there are letters or an underscore in there somewhere
if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) {
$test = str_replace($strHashtag, '<a href="http://search.twitter.com/search?q=%23'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test);
}
}
}
echo $test;
?>
Funciona; pero parece bastante largo aliento para lo que hace. Mi pregunta es, ¿hay una sola preg_replace similar a la que me dieron desde gist.github que condicionalmente volverá a escribir hashtags en hipervínculos SOLAMENTE si no lo hacen sólo contienen números?
Solución
(^|\s)#(\w*[a-zA-Z_]+\w*)
PHP
$strTweet = preg_replace('/(^|\s)#(\w*[a-zA-Z_]+\w*)/', '\1#<a href="http://twitter.com/search?q=%23\2">\2</a>', $strTweet);
Esta expresión regular dice un # seguido por 0 o más caracteres [a-zA-z0-9_], seguido por un carácter alfabético o un guión bajo (1 o más), seguido por 0 o más caracteres de palabra.
http://rubular.com/r/opNX6qC4sG <-. Prueba aquí
Otros consejos
Es realmente mejor para buscar caracteres que no están permitidos en un hashtag de lo contrario etiquetas como "# Trentemøller" no funcionará.
La siguiente funciona bien para mí ...
preg_match('/([ ,.]+)/', $string, $matches);
He ideado esto: /(^|\s)#([[:alnum:]])+/gi
respuesta de trabajo, aunque la expresión regular añadió un espacio en blanco al principio del hashtag, por lo que eliminado la primera parte:
(^|\s)
Esto funciona perfectamente para mí ahora:
#(\w*[a-zA-Z_0-9]+\w*)
Ejemplo aquí: http://rubular.com/r/dS2QYZP45n