2010-11-25 6 views
9

J'écris un petit script PHP pour récupérer la dernière demi-douzaine de mises à jour de statut Twitter à partir d'un flux utilisateur et les formater pour les afficher sur une page Web. Dans le cadre de cela, j'ai besoin d'un regex remplacer pour réécrire les hashtags comme des hyperliens vers search.twitter.com. Dans un premier temps j'ai essayé d'utiliser:Regex remplacera conditionnellement les hashtags Twitter par des liens hypertexte

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

(prise de https://gist.github.com/445729)

Au cours des essais 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érification sur Internet et en jouant avec diverses balises, je suis arrivé à la conclusion qu'un hashtag doit contenir des caractères alphabétiques ou un trait de soulignement à l'intérieur pour constituer un lien; les balises avec seulement des caractères numériques sont ignorées (vraisemblablement pour empêcher des choses comme "Bonne présentation Bob, la diapositive n ° 3 était ma préférée!" d'être liée). Cela rend le code ci-dessus incorrect, car il convertira heureusement # 123 en un 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 long pour ce qu'il fait. Ma question est, y a-t-il un seul preg_replace semblable à celui que j'ai obtenu de gist.github qui réécrira conditionnellement les hashtags en liens hypertexte SEULEMENT s'ils NE contiennent PAS juste des nombres? , Suivi d'un caractère alphabétique ou un trait de soulignement (1 ou plus)

Répondre

23
(^|\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 de 0 ou plusieurs caractères.

http://rubular.com/r/opNX6qC4sG < - Testez-le ici.

+0

Ah, parfait! Et remarquablement simple aussi ... mon cerveau ne fonctionne pas correctement aujourd'hui. : p Merci beaucoup! – foxsoup

+0

Est-ce que cela prend en compte les caractères spéciaux, @Gazler? Dire Prendra-t-il des mots comme # Prévoyance? – Jeremy

+0

@Jeremy Non, mais cela devrait faire l'affaire '(^ | \ s) # (\ w * [\ S! #] + \ W *)' –

0

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

1

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.

Les œuvres suivantes bien pour moi ...

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

J'ai trouvé Gazlers answer au travail, bien que le regex a ajouté un espace vide au début du hashtag, alors j'ai enlevé la première partie:

(^|\s) 

Cela fonctionne parfaitement pour moi maintenant:

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

Exa mple ici: http://rubular.com/r/dS2QYZP45n

+0

Votre expression modifiée n'est-elle pas la même que '# (\ w * \ w + \ w *)'? –

+0

Quoi qu'il en soit, la réponse de Gazler fonctionne, elle n'ajoute pas d'espace au début du hashtag, elle capture deux groupes, mais vous ne voulez que le 2ème groupe. –

Questions connexes