2

テキストを含む文字列があり、いくつかの場所に Twitter スタイルのハッシュタグがあります。それらを見つけて、それらすべてがスペースで区切られた別の変数を作成したいと思います。また、元の文字列のすべてのハッシュタグをリンクに変換したいと考えています。例:

$string = "Hello. This is a #hashtag and this is yet another #hashtag. This is #another #example."

関数の後:

$string_f = "Hello this is a <a href='#'>#hashtag</a> and this is yet another <a href='#'>#hashtag</a>. This is <a href='#'>another</a> <a href='#'>example</a>";

$tags = '#hashtag #another #example';
4

2 に答える 2

6

すべてのハッシュ タグを見つけるには、正規表現と を使用し、次preg_match_all()のように置き換えpreg_replace()ます。

$regex = '/(#[A-Za-z-]+)/';
preg_match_all( $regex, $string, $matches);
$string_f = preg_replace( $regex, "<a href='#'>$1</a>", $string);

次に、すべてのタグが の配列にあり$matches[1]ます。

$tags_array = $matches[1];

implode()次に、それをandでスペース区切りのリストに変換しarray_unique()ます。

$tags = implode( ' ', array_unique( $tags_array));

これで完了です。このデモから、$tags$string_fが次のことがわかります。

"#hashtag #another #example"
"Hello. This is a <a href='#'>#hashtag</a> and this is yet another <a href='#'>#hashtag</a>. This is <a href='#'>#another</a> <a href='#'>#example</a>."

ハッシュタグの他の文字 (数字など) については、$regex適切に変更します。

編集:ただし、preg_replace_callback()クロージャを使用すると効率が向上する可能性があるため、次のように正規表現を 1 回実行するだけで済みます。

$tags_array = array();
$string_f = preg_replace_callback( '/(#[A-Za-z-]+)/', function( $match) use( &$tags_array) { 
    $tags_array[] = $match[1];
    return "<a href='#'>" . $match[1] . "</a>";
}, $string);
$tags = implode( ' ', array_unique( $tags_array));
于 2013-01-09T14:26:46.280 に答える
0

ちょっと気の利いた正規表現はいかがですか?

preg_match_all("/#[\w\d]+/", $string, $matches, PREG_SET_ORDER);
unset($matches[0]);
$tags = implode(" ", $matches);
于 2013-01-09T14:26:25.507 に答える