Regex per sostituire condizionalmente hashtags di Twitter con collegamenti ipertestuali
Domanda
Sto scrivendo un piccolo script PHP per afferrare gli ultimi aggiornamenti di stato mezza dozzina di Twitter da un feed utente e formattare per la visualizzazione su una pagina web. Come parte di questo ho bisogno di una regex sostituire riscrivere hashtag come collegamenti ipertestuali a search.twitter.com. Inizialmente ho cercato di utilizzare:
<?php
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet);
?>
(tratto da https://gist.github.com/445729 )
Nel corso del test ho scoperto che #test viene convertito in un link sul sito web Twitter, tuttavia # 123 non lo è. Dopo un po 'di controllo su internet e giocare con vari tag sono giunto alla conclusione che un hashtag deve contenere caratteri alfabetici o una sottolineatura in qualche parte per costituire un collegamento; tag con solo caratteri numerici vengono ignorati (presumibilmente per le cose di arresto come "Buona presentazione Bob, scivolo # 3 era il mio preferito!" di essere collegato). Questo rende il codice di cui sopra non corretta, in quanto sarà lieto di convertire 123 ° in un collegamento.
Non ho fatto molto regex in un po ', quindi nel mio rustyness mi si avvicinò con la seguente soluzione 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;
?>
Si lavora; ma sembra piuttosto prolisso per quello che fa. La mia domanda è: esiste un unico preg_replace simile a quello che ho ricevuto da gist.github che condizionalmente riscrivere hashtag in collegamenti ipertestuali solo se non contengono solo numeri?
Soluzione
(^|\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);
Questa espressione regolare, dice un # seguito da 0 o più caratteri [a-zA-z0-9_], seguito da un carattere alfabetico o un underscore (1 o più), seguita da 0 o più caratteri alfanumerici.
http://rubular.com/r/opNX6qC4sG <-. Test qui
Altri suggerimenti
In realtà è meglio per la ricerca di caratteri che non sono consentiti in un hashtag altrimenti tag come non funzionerà "# Trentemøller".
Il seguente funziona bene per me ...
preg_match('/([ ,.]+)/', $string, $matches);
Ho ideato questo: /(^|\s)#([[:alnum:]])+/gi
Ho trovato Gazlers risposta al lavoro, anche se la regex aggiunto uno spazio vuoto all'inizio della hashtag, così ho rimosso la prima parte:
(^|\s)
Questo funziona perfettamente per me, ora:
#(\w*[a-zA-Z_0-9]+\w*)
Esempio qui: http://rubular.com/r/dS2QYZP45n