前提・実現したいこと
$content というWordPressの投稿の中から、Twitterのスクリーンネーム(@から始まり、英数字とアンダーバーで1-15文字)を検索し、それを<a href="https://twitter.com/user">@user</a>に置換する。というプログラムを作っています。
しかし下のように、文字列の中に予めリンクが含まれると二重にリンクが貼られてしまいます。
aタグの中の@userには置換を行わず、aタグの外の@userのみを置換したいです。
色々、正規表現を試してみたのですが、上手くいきませんでした。
お教え頂けると嬉しいです。
該当のソースコード
php
1$content ='こんにちは、<a href="https://twitter.com/user1">@user1</a>と、@user2さん。'; 2function replace_tw_user_name_to_link( $content ) { 3 $content = preg_replace( '/@([0-9a-z_]{1,15})/i', '<a href="https://twitter.com/' . '$1' . '">' . '@' . '$1' . '</a>', $content ); 4 return $content; 5} 6 7echo $content; 8結果:'こんにちは、<a href="https://twitter.com/user1"><a href="https://twitter.com/user1">@user1</a></a>と、<a href="https://twitter.com/user2">@user2</a>さん。'
$contentの中には他のhtmlタグが含まれている可能性もありますよね?
$contentに入る情報の前提条件を全て提示していただければ助かります。今回悩まれているaタグ以外にもあるようであれば、そこも考慮しなければなりません。
$contentはWordPressの投稿の内容を取得しています。なのでstring型ではありますが他のhtmlタグが含まれる可能性があります。
質問ありがとうございます!
WordPress をタグに追加しておいてください。特殊な技法も多いのでWordPress的なやり方の提案がもらえるかもしれません。
ありがとうございます!
tweets apiでリンクされてないユーザーは存在しないユーザーでは?
ツイッターアカウントは5文字以上15文字以内だな
ありがとうございます! 今回はapiは使わない方向で考えていました。
@aのようなユーザー名(ユーザーID)?もあったので、一文字からではないでしょうか?
変更しようとしたら短すぎますって怒られましたよ
仕様が変わったのかもしれないです。ただ@aがありえる以上は1-15文字に制限するのが適切かと思います。
twitterには「名前」「ユーザー名(スクリーンネーム)」「ユーザーID」の3つの名前があるので、そこで両名の認識がずれてる気がします。
ありがとうございます。3つの違いを調べました!
スクリーンネーム(screen_name)を含んだ記事が投稿された時、そのアカウントへリンクを張りたいです。
あれ?解決したのでは?
あ、解決しました!すみません、やりたいことを明確に書き直していたほうが良いかと思い上の投稿しました。
回答4件
あなたの回答
tips
プレビュー