Regex Twitterハッシュタグをハイパーリンクに条件付きで置き換える

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

  •  28-09-2019
  •  | 
  •  

質問

私は小さなPHPスクリプトを書いて、ユーザーフィードから最新の半ダースのTwitterステータスの更新を取得し、Webページに表示するためにそれらをフォーマットしています。この一部として、ハッシュタグを書き換えるには、HyperLinksを検索するためにハッシュタグを書き換えるために正規表現が必要です。最初は使用しようとしました。

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

(から取られた https://gist.github.com/445729)

テストの過程で、#TestがTwitter Webサイトのリンクに変換されていることを発見しましたが、#123はそうではありません。インターネットで少しチェックして、さまざまなタグで遊んだ後、ハッシュタグにはアルファベットのある文字またはその中にアンダースコアが含まれている必要があるという結論に達しました。数値文字のみを持つタグは無視されます(おそらく「良いプレゼンテーションボブ、スライド#3が私のお気に入りだった!」などを止めるためにリンクされています)。これにより、#123をリンクに喜んで変換するため、上記のコードが正しくなります。

私はしばらくの間、あまり正規表現をしていなかったので、私の錆びの中で、次の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;
?>

できます;しかし、それはそれが何をするかについてはかなり長く思われます。私の質問は、gist.githubから得たものと同様の単一のpreg_replaceがあり、数字だけが含まれていない場合にのみ、ハッシュタグをハイパーリンクに条件付きで書き直すことがありますか?

役に立ちましたか?

解決

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

この正規表現には、#が0以上の文字[A-ZA-Z0-9_]が続くと、アルファベットの文字またはアンダースコア(1以上)が続き、その後に0以上の単語文字が続きます。

http://rubular.com/r/opnx6qc4sg < - ここでテストします。

他のヒント

実際には、ハッシュタグで許可されていない文字を検索する方が良い場合は、「#trentemøller」などのタグが機能しません。

以下は私のためにうまくいきます...

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

私はこれを考案しました: /(^|\s)#([[:alnum:]])+/gi

ガズラーを見つけました 答え 作業するために、正規表現はハッシュタグの先頭に空白スペースを追加したので、最初の部分を削除しました。

(^|\s)

これは今私にとって完璧に機能します:

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

ここの例: http://rubular.com/r/ds2qyzp45n

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top