2009-07-21 8 views
4

Ich baue ein kleines Twitter Ding in PHP und ich versuche, URLs, @Antworten und #Hashtags zu analysieren und sie zu anklickbaren Links zu machen.Finde URLs, @Antworten und #Hashtags von Tweets

möchte ich eine Klasse für das Parsen von URLs gefunden habe, und ich frage mich, ob dies auch verwendet werden könnten, analysieren @ Antworten und #Hashtags auch:

// http://josephscott.org/archives/2008/11/makeitlink-detecting-urls-in-text-and-making-them-links/  
class MakeItLink { 
protected function _link_www($matches) { 
    $url = $matches[2]; 
    $url = MakeItLink::cleanURL($url); 
    if(empty($url)) { 
     return $matches[0]; 
    } 

    return "{$matches[1]}<a href='{$url}'>{$url}</a>"; 
} 

public function cleanURL($url) { 
    if($url == '') { 
     return $url; 
    } 

    $url = preg_replace("|[^a-z0-9-~+_.?#=!&;,/:%@$*'()x80-xff]|i", '', $url); 
    $url = str_replace(array("%0d", "%0a"), '', $url); 
    $url = str_replace(";//", "://", $url); 

    /* If the URL doesn't appear to contain a scheme, we 
    * presume it needs http:// appended (unless a relative 
    * link starting with/or a php file). 
    */ 
    if(
     strpos($url, ":") === false 
     && substr($url, 0, 1) != "/" 
     && !preg_match("|^[a-z0-9-]+?.php|i", $url) 
    ) { 
     $url = "http://{$url}"; 
    } 

    // Replace ampersans and single quotes 
    $url = preg_replace("|&([^#])(?![a-z]{2,8};)|", "&#038;$1", $url); 
    $url = str_replace("'", "&#039;", $url); 

    return $url; 
} 

public function transform($text) { 
    $text = " {$text}"; 

    $text = preg_replace_callback(
     '#(?<=[\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/\[email protected]\[\](+]|[.,;:](?![\s<])|(?(1)\)(?![\s<])|\)))*)#is', 
     array('MakeItLink', '_link_www'), 
     $text 
    ); 

    $text = preg_replace('#(<a([^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $text); 
    $text = trim($text); 

    return $text; 
} 
} 
+0

Gibt es hier eine Frage? Haben Sie Probleme mit diesem Code? – inkedmn

+0

Ja, diese Klasse analysiert nur Links, ich möchte auch @replies und #hashtags analysieren und sie in Links umwandeln – Tom

Antwort

20

denke ich, was Sie suchen im wesentlichen zu tun ist, was Ich habe unten eingefügt. Sie würden diese beiden Anweisungen in der Methode transform direkt vor der Rückgabeanweisung hinzufügen.

$text = preg_replace('#@(\w+)#', '<a href="http://twitter.com/$1">$0</a>', $text); 
$text = preg_replace('/#(\w+)/', '<a href="http://twitter.com/search?q=%23$1&src=hash">$0</a>', $text); 

Ist das wonach Sie suchen?

+0

Das funktioniert geliebter, danke :) – Tom

+0

Ich liebe, wie einfach diese Implementierung ist. Korrekt! –

+0

Hallo @SoaperGEM, dies berücksichtigt keine Sonderzeichen in Hashtags, sagen wir, es funktioniert nicht für Wörter wie # Prévoyance. Irgendeine Problemumgehung? – Jeremy

3

Twitter recently released Quelle öffnen beide java und ruby (gem) Implementierungen der Code, den sie verwenden, um Benutzernamen für die Suche, Hash-Tags, Listen und URLs.

Es ist sehr regelmäßig ausdrucksorientiert.

+0

Es gibt auch einen PHP-Port. https://github.com/mikenz/twitter-text-php – AllInOne

Verwandte Themen