Question

J'écris un petit script PHP pour saisir les dernières demi-douzaine Twitter mises à jour d'état d'un flux de l'utilisateur et les formater pour l'affichage sur une page Web. Dans le cadre de ce que je dois remplacer une expression régulière pour réécrire hashtags comme des liens hypertextes vers search.twitter.com. Dans un premier temps j'ai essayé d'utiliser:

<?php
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet);
?>

(tiré de https://gist.github.com/445729 )

Au cours de l'essai, j'ai découvert que #test est converti en un lien sur le site Twitter, mais # 123 est pas. Après un peu de vérifier sur Internet et jouer avec différentes balises, je suis venu à la conclusion qu'un hashtag doit contenir des caractères alphabétiques ou un trait de soulignement en quelque part pour constituer un lien; tags avec uniquement des caractères numériques sont ignorés (sans doute à des choses d'arrêt comme « Bonne présentation Bob, diapositive 3 était mon préféré! » d'être lié). Cela rend le code ci-dessus incorrect, car il se fera un plaisir de convertir # 123 en lien.

Je n'ai pas fait beaucoup regex dans un certain temps, donc dans mon rustyness je suis venu avec la solution PHP suivante:

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

Il fonctionne; mais il semble assez longue haleine pour ce qu'il fait. Ma question est, est-il un seul preg_replace semblable à celui que je suis arrivé de gist.github qui conditionnellement réécrire hashtags en hyperliens seulement si elles ne contiennent des chiffres seulement?

Était-ce utile?

La solution

(^|\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);

Cette expression régulière dit un # suivi de 0 ou plusieurs caractères [a-zA-z0-9_], suivi par un caractère alphabétique ou un trait de soulignement (1 ou plus), suivi de 0 ou plusieurs caractères de texte.

http://rubular.com/r/opNX6qC4sG <-. Essai ici

Autres conseils

Il est en fait préférable de rechercher des caractères qui ne sont pas autorisés dans un hashtag sinon des tags comme « # Trentemøller » ne fonctionnera pas.

Ce qui suit fonctionne bien pour moi ...

preg_match('/([ ,.]+)/', $string, $matches);

Je l'ai imaginé ceci: /(^|\s)#([[:alnum:]])+/gi

J'ai trouvé Gazlers réponse au travail, bien que le regex a ajouté un espace vide au début du hashtag, donc je retiré de la première partie:

(^|\s)

Cela fonctionne parfaitement pour moi maintenant

#(\w*[a-zA-Z_0-9]+\w*)

Exemple ici: http://rubular.com/r/dS2QYZP45n

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top