Expresiones regulares para reemplazar condicionalmente hashtags de Twitter con hipervínculos

StackOverflow https://stackoverflow.com/questions/4277070

  •  28-09-2019
  •  | 
  •  

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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top