Frage

Ich schreibe einen kleinen PHP-Skript, um das neueste halbes Dutzend Twitter Status-Updates von einem Benutzer-Feed zu greifen und zu formatieren sie auf einer Webseite für die Anzeige. Als Teil davon muss ich eine Regex zu umschreiben Hashtags als Hyperlinks zu search.twitter.com ersetzen. Am Anfang habe ich versucht, zu verwenden:

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

(aus https://gist.github.com/445729 )

Im Zuge der Prüfung entdeckte ich, dass #test in einen Link auf der Twitter-Website umgewandelt wird, aber # 123 ist es nicht. Nach ein wenig im Internet zu kontrollieren und mit verschiedenen Tags Herumspielen kam ich zu dem Schluss, dass ein Hashtag alphabetische Zeichen oder einen Unterstrich in es irgendwo einen Link enthalten müssen zu bilden; Tags mit nur numerischen Zeichen (vermutlich zu stoppen Dinge wie „Gute Präsentation Bob, Schlitten # 3 waren mein Favorit!“ von der Linksetzung) ignoriert. Dies macht den obigen Code falsch, wie es glücklich # 123 in einen Link umwandeln wird.

Ich habe nicht viel regex in einer Weile getan, also in meinem rustyness kam ich auf der folgenden PHP-Lösung:

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

Es funktioniert; aber es scheint ziemlich langatmig für das, was sie tut. Meine Frage ist, gibt es einen einzigen preg_replace ähnlich dem ich von gist.github bekam, die bedingt Hashtags in Hyperlinks neu schreiben nur, wenn sie nur Zahlen enthalten nicht?

War es hilfreich?

Lösung

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

Dieser reguläre Ausdruck sagt ein # von 0 oder mehr Zeichen gefolgt [a-zA-Z0-9_], gefolgt von einem Buchstaben oder einem Unterstrich (1 oder mehr), gefolgt von 0 oder mehr Wortzeichen.

http://rubular.com/r/opNX6qC4sG . <- Test hier

Andere Tipps

Es ist besser, tatsächlich für Zeichen zu suchen, die nicht in einem Hashtag erlaubt sind sonst Tags wie „# Trentemøller“ wird nicht funktionieren.

Die folgenden funktioniert gut für mich ...

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

Ich habe entworfen diese: /(^|\s)#([[:alnum:]])+/gi

fand ich Gazlers Antwort zu arbeiten, obwohl die regex ein Leerzeichen am Anfang des hashtag hinzugefügt, so dass ich entfernt der erste Teil:

(^|\s)

Das funktioniert perfekt für mich jetzt:

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

Beispiel hier: http://rubular.com/r/dS2QYZP45n

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top