Regex per sostituire condizionalmente hashtags di Twitter con collegamenti ipertestuali

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

  •  28-09-2019
  •  | 
  •  

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top