9

私は小さなPHPスクリプトを作成して、ユーザーフィードから最新の5ダースのTwitterステータスの更新を取得し、Webページに表示するためにフォーマットします。この一環として、ハッシュタグをsearch.twitter.comへのハイパーリンクとして書き換えるために正規表現を置き換える必要があります。最初に私は使用しようとしました:

<?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があり、ハッシュタグに数字だけが含まれていない場合にのみ、条件付きでハッシュタグをハイパーリンクに書き換えますか?

4

4 に答える 4

23
(^|\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<-ここでテストします。

于 2010-11-25T12:33:08.013 に答える
1

実際には、ハッシュタグで許可されていない文字を検索することをお勧めします。そうしないと、「#Trentemøller」のようなタグは機能しません。

以下は私にとってうまくいきます...

preg_match('/([ ,.]+)/', $string, $matches);
于 2011-05-30T20:06:23.760 に答える
0

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

于 2010-11-25T13:09:48.040 に答える
0

正規表現はハッシュタグの先頭に空白を追加しましたが、Gazlers の回答が機能することがわかったので、最初の部分を削除しました。

(^|\s)

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

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

例: http://rubular.com/r/dS2QYZP45n

于 2013-09-11T22:26:55.383 に答える