Utilizzo di espressioni regolari per aggiungere collegamenti a tweets

Scritto il 2 novembre 2009 / / programmazione .

regex Using Regular Expressions to add links to tweets L'utilizzo di Twitter da parte sua interfaccia web o tramite il client più recenti, gli utenti abituati a vedere i nomi utente e legati @ # hashtags all'interno di qualsiasi stato di aggiornamento che leggono.
Quando si usa Twitter API sul vostro sito web, servizio o applicazione, è necessario trattare con tweet testo normale, senza tag in modo che nessun link. Utilizzo di espressioni regolari è possibile creare collegamenti facilmente e rapidamente, in modo del tutto qualsiasi linguaggio di programmazione.

Come quello che conta davvero è l'espressione regolare stessa e non il linguaggio di programmazione utilizzato, vorrei solo mostrare due esempi, utilizzando PHP e Perl.

Una breve introduzione

Immaginiamo interrogato Twitter API e tornato un tweet come la seguente


 appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto

per fare un buon lavoro abbiamo bisogno di creare 3 link:

  • mariorossi @ saranno collegati al suo profilo di Twitter
  • someforum # connessi alla ricerca su Twitter
  • http://bit.ly/foo per il proprio legame

Che cosa vogliamo ottenere è quello di eplace r una qualsiasi delle stringhe con un link HTML che fa riferimento l'URL corretto. Abbiamo ovviamente bisogno di considerare che è possibile avere più di una parola chiave per ogni tipo.

Sostituzione di funzioni in PHP e Perl

Come abbiamo detto prima, abbiamo la necessità di sostituire un testo con un link, vediamo quali funzioni che andremo a usare

PHP

Php permette agli sviluppatori di interfacciarsi con sostituzioni regex utilizzando la funzione preg_replace nativo. La sintassi necessaria è spiegato in seguito


 preg_replace ('/ search /', 'sostituire', fonte di $);

Nella nostra ricerca caso sarà l'espressione regolare che ci accingiamo a costruire, sostituire è il link e la fonte nostri tweet iniziale.

Perl

Perl utilizza una sintassi diversa, facendo uso di espressioni regolari native ~ operatore


 Tweet $ = ~ s / ricerca / sostituzione / g;

dove $ tweet è sia la nostra origine e la produzione, la ricerca è la nostra regex e sostituire il nostro link.

Se vuoi inserire username @

Prima di tutto creiamo una espressione regolare in grado di riconoscere nomi quotati in un tweet


 / @ ([A-zA *]-Z0-9_) /

Come nomi utente twitter consentire solo caratteri alfanumerici più il carattere di sottolineatura l'espressione regolare è stato costruito in modo che corrisponda semplicemente il nome utente, in modo che gli indirizzi email sono esclusi (contengono punti).

DETTAGLI Regular Expression

  • @ iniziale è necessaria per cominciare a trovare il nome utente. E 'al di fuori della parentesi quindi non è restituito dal espressioni regolari e abbiamo bisogno di ricordarsi di scrivere di nuovo la in uscita.
  • all'interno delle parentesi () c'è tutto tornerà.
  • dentro le piazze [] ci sono i personaggi che le consentono di essere presente nel nome utente. az è più in basso latino char, AZ qualsiasi maiuscolo char, 0-9 qualsiasi numero e _, ben l'underscore
  • * l'asterisco indica che ogni personaggio del precedente potrebbero essere presenti per infinite volte nella nostra stringa di matching. Questo significa solo che non sappiamo esattamente quanto tempo il nome utente sarà

SCEGLI LA DESTRA DI USCITA

Il link necessari per qualsiasi menzione @ twitter è il profilo di quell'utente. Poiché la nostra espressione regolare sarà di ritorno solo valore useremo tale valore per costruire quel collegamento. Ricordate che la nostra espressione regolare restituirà solo l'username, senza la [at]!


 href="http://twitter.com/$1" <a title="$1 profilo su Twitter" rel="nofollow"> @ $ 1 </ a>

Si noti che $ 1 è il nome utente restituito dal espressioni regolari, e che rel = "nofollow" è usato per la sicurezza page rank.

Infine, avendo entrambe le espressioni regolari per la ricerca e il legame sostituzione, si può procedere per creare il codice

PHP


 Tweet $ = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 $ regex ='/@([ ]*)/'; a-zA-Z0-9_
 Link_pattern $ = '<a href="http://twitter.com/$1" title="$1 profilo su Twitter" rel="nofollow"> @ $ 1 </ a>';
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);

Perl


 my $ tweet = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 Tweet $ = ~ s / @ ([a-zA-Z0-9_ ]*)/< a href = "http://twitter.com/ $ 1" title = "profilo di $ 1 su Twitter" rel = "nofollow"> @ $ 1 </ a> / g;

Entrambi i codici di cui sopra (se fatto eco o stampato) sarebbe uscita

appena visto mariorossi @ # someforum a parlare del suo prodotto http://bit.ly/foo

Se vuoi hashtags #

L'espressione regolare necessari per hashtags è proprio la stessa di quella che abbiamo visto in precedenza per @ username, ovviamente sostituendo la @ con un cancelletto #. L'output sarà simile anche, ma cambiando dal dominio di Twitter a quello di ricerca come questo


 <a title="search href="http://search.twitter.com/search?q=%23$1" per 1 dollaro su twitter" rel="nofollow"> # $ 1 </ a>

cui 23% è il simbolo urlencoded per l'hash e tutti gli altri parametri sono già stati spiegati.

Come si dovrebbe capire tutto ciò che riguarda la regex precedente mi limiterò a elencare i codici completi.

PHP


 Tweet $ = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 $ regex ='/#([ ]*)/'; a-zA-Z0-9_
 Link_pattern $ = 'href="http://search.twitter.com/search?q=%23$1" title="search <a per 1 dollaro su Twitter" rel="nofollow"> # $ 1 </ a>';
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);

Perl


 my $ tweet = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 Tweet $ s = ~ / \ # ([a-zA-Z0-9_ ]*)/< a href = "% 23 http://search.twitter.com/?q = $ 1" titolo "per la ricerca = 1 $ per Twitter "rel =" "> nofollow # $ 1 </ a> / g;

Entrambi i codici precedenti sarebbe uscita

appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto

Consulta per i collegamenti

Ultime sostituzione stiamo per compiere è di circa il link. Per abbinare i link che andremo a cercare qualsiasi tipo di parola situato tra http e uno spazio, o una parentesi. Ecco la regex


 / Http ([s]?): \ / \ / ([^ \ \ )$]*)/

DETTAGLI Regular Expression

  • http è fuori dal nostro corrispondente, è solo bisogno di ricerca per gli URL nei tweet
  • ([S]?) È un semplice trucco per abbinare sia URL HTTP e HTTPS. Essa corrisponde e restituisce la 's' solo se esiste "?"
  • : / / È solo la parte successiva del URL
  • ([^ \ \ )$]*) Partite caratteri infinito (*) che potrebbe essere qualsiasi cosa tranne "^" lo spazio "\" una parentesi chiusa "\)" o la fine della stringa "$"

SCEGLI LA DESTRA DI USCITA
Ovviamente per un collegamento abbiamo solo bisogno di mettere il tag <a> prima il link e chiuderlo subito dopo. Tuttavia a causa della nostra precisione sul protocollo di corrispondenza (http o https) abbiamo bisogno di usare 2 variabili nella nostra produzione: $ 1 sarà la s (se presente), $ 2 sarà l'url reale. Di seguito è riportato l'output completo


 <a href="http$1://$2" rel="nofollow" title="$2"> http $ 1: / / $ 2 </ a>

Così qui sono i due esempi

PHP


 Tweet $ = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 $ regex = '/ http ([s]?): \ / \ / ([^ \ \ )$]*)/';
 Link_pattern $ = '<a href="http$1://$2" rel="nofollow" title="$2"> http $ 1: / / $ 2 </ a>';
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);

Perl


 my $ tweet = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 Tweet $ = ~ s / http ([s]?): \ / \ / ([^ \ \ )$]*)/< a href = "http $ 1: / / $ 2" rel = "" title = nofollow "$ 2 "http> $ 1: / / $ 2 </ a>

Entrambi i codici precedenti sarebbe uscita

appena visto parlando a mariorossi @ # someforum circa il suo prodotto http://bit.ly/foo

Il codice completo

Come riferimento ho una relazione per ogni lingua il codice completo di questo esempio.

PHP


 Tweet $ = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 $ regex = '/ http ([s]?): \ / \ / ([^ \ \ )$]*)/';
 Link_pattern $ = '<a href="http$1://$2" rel="nofollow" title="$2"> http $ 1: / / $ 2 </ a>';
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);
 $ regex ='/@([ ]*)/'; a-zA-Z0-9_
 Link_pattern $ = '<a href="http://twitter.com/$1" title="$1 profilo su Twitter" rel="nofollow"> @ $ 1 </ a>';
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);
 $ regex = '/ \ # ([a-zA-Z0-9_ ]*)/';
 Link_pattern $ = 'href="http://search.twitter.com/search?q=%23$1" title="search <a per 1 dollaro su Twitter" rel="nofollow"> \ # $ 1 </ a>' ;
 Tweet $ = preg_replace ($ regex, $ link_pattern tweet, $);

Perl


 my $ tweet = 'appena visto parlando a mariorossi @ # someforum sulla sua http://bit.ly/foo prodotto';
 Tweet $ = ~ s / http ([s]?): \ / \ / ([^ \ \ )$]*)/< a href = "http $ 1: / / $ 2" rel = "" title = nofollow "$ 2 "http> $ 1: / / $ 2 </ a>
 Tweet $ = ~ s / @ ([a-zA-Z0-9_ ]*)/< a href = "http://twitter.com/ $ 1" title = "profilo di $ 1 su Twitter" rel = "nofollow"> @ $ 1 </ a> / g;
 Tweet $ s = ~ / \ # ([a-zA-Z0-9_ ]*)/< a href = "% 23 http://search.twitter.com/?q = $ 1" titolo "per la ricerca = 1 $ per Twitter "rel =" nofollow "> \ # $ 1 </ a> / g;

Forse Related Posts: (generato automaticamente)


  • loige
    Veramente utile:) grazie!

    Ecco una funzione javascript equivalente, sulla base di tutorial:)


    function twitterAddLinks(text)
    {
    return text.replace( /http([s]?):\/\/([^\ \)$]*)/,
    ' http$1://$2 ')
    .replace(/@([a-zA-Z0-9_]*)/,
    ' @$1 ')
    .replace(/\#([a-zA-Z0-9_]*)/,
    ' \#$1 ');
    }
  • loige
    Ops ... Ho dimenticato la bandiera ricerca globale: P ecco una nuova versione della funzione javascript ...


    function twitterAddLinks(text)
    {
    return text.replace( /http([s]?):\/\/([^\ \)$]*)/g,
    ' http$1://$2 ')
    .replace(/@([a-zA-Z0-9_]*)/g,
    ' @$1 ')
    .replace(/\#([a-zA-Z0-9_]*)/g,
    ' \#$1 ');
    }
  • loige
    Mi dispiace, non so se c'è un modo per incollare il codice su disquis ... quindi controlla il codice sul pastebin: http://pastebin.com/f69796c47
  • Sì, purtroppo ci sono alcuni problemi con frammenti incollati. Grazie tante per il suggerimento JS, verrà aggiornato il mio articolo originale di collegamento al vostro commento.
  • loige
    Grazie a te per l'articolo grande;)
    [E Dato Che siamo entrambi italiani te lo dico in italiano ANCHE: GRAZIE A TE; p]
  • Derubare
    È necessario modificare il "esempio completo" perché la traduzione collegamento deve prendere il primo posto. In caso contrario, tutti i precedenti legami creati sono danneggiati.
  • Oh, si sta decisamente bene! Grazie mille
osservazioni del blog alimentate da Disqus