アプリ版:「スタンプのみでお礼する」機能のリリースについて

Wikiの様な形で任意のキーワードに対して自動的にリンクを張るスクリプトを構築したいと考えています。

入力された文章をシンプルに検索・置換するだけであれば自分でも出来るのですが、文章内にHTMLタグが含まれている為、うまく動作しません。


例)「おむすび」というキーワードに対して自動リンクを張る場合

入力された文章:
<a href="hoge.php" title="おむすびマン">おむすびマン</a>が作ったおむすび

検索・置換後の文章:
<a href="hoge.php" title="<a href="omusubi">おむすび</a>マン"><a href="omusubi">おむすび</a>マン</a>が作った<a href="omusubi">おむすび</a>


上記の状況になっており、自分でも解決方法を模索したのですがいまいち思い浮かびません。正規表現の使い方次第で出来るような気がするのですが・・。
最終的には任意のHTMLタグに囲まれていないキーワードにのみ自動リンクを作成するという構造にしたいと考えています。

この問題を解決するにはどのようにスクリプトを組むとよいのでしょうか?
使用言語はPHPです、どうぞ宜しくお願い致します。

A 回答 (2件)

昔作ったことがあります。

確かにこれは苦戦しますね。

1.正規表現かstr_replaceで、aタグを別の文字列Xに置換→「Xが作ったおむすび」という文字列に変形
2.「Xが作ったおむすび」の「おむすび」にリンクを付与
3.文字列Xをaタグに戻す

1.の実装例
$s_hoge = str_replace(strtolower($keyword),"<?>".strtolower($keyword)."</?>",$hoge);
$s_hoge = preg_replace('/('.strtolower($keyword).')/',"<?>".'$0'."</?>",$hoge);

3.の実装例
$hoge = str_replace("<?>","<a href=\"hoge.php\" title=\"おむすびマン\">",$s_hoge);
$hoge = str_replace("</?>","</a>",$hoge);

かなり大雑把ですが、こんな感じで作りました。ちなみに、preg_replaceよりstr_replaceの方が早いので、str_replaceを使ったというコメントを自分自身で残しています。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

これで実現可能ですが、aタグの種類が複数ある場合対応できないですね・・・。
とりあえずは解決しました、ありがとうございました!

お礼日時:2009/04/13 11:46

>>この問題を解決するにはどのようにスクリプトを組むとよいのでしょうか?



とりあえず、<a>タグだけに対応した例を示します
<?php
// 元の文字列
$str='<a href="hoge.php" title="おむすびマン">おむすびマン</a>が作ったおむすび';

// 結果表示
echo preg_replace_callback("/(<a.+?<\/a>)|(おむすび)/i", "addlink", $str);

function addlink($match) {
if ($match[0]!="おむすび") return $match[0];
else return '<a href="omusubi">おむすび</a>';
}
?>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

理想通りの結果になりました!
少し修正すればaタグ以外にも対応できますね。

ありがとうございました!

お礼日時:2009/04/13 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!