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です、どうぞ宜しくお願い致します。
No.1
- 回答日時:
昔作ったことがあります。
確かにこれは苦戦しますね。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を使ったというコメントを自分自身で残しています。
回答ありがとうございました。
これで実現可能ですが、aタグの種類が複数ある場合対応できないですね・・・。
とりあえずは解決しました、ありがとうございました!
No.2ベストアンサー
- 回答日時:
>>この問題を解決するにはどのようにスクリプトを組むとよいのでしょうか?
とりあえず、<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>';
}
?>
回答ありがとうございます。
理想通りの結果になりました!
少し修正すればaタグ以外にも対応できますね。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Firefox(ファイヤーフォックス) Firefox bookmarkの検索BOXでのインクリメンタルサーチを止めたい 5 2022/06/29 12:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS リンクバナーのHTMLタグ。画像を変えたり、設置位置を変えるとバナー貼付け側はどう見える? 2 2023/02/01 12:01
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- 事件・犯罪 刑法についてです 2 2022/06/04 03:11
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c# string型の変数に、ダブルク...
-
(から)までの文字列を削除したい
-
【php】二進数をフラグとして扱...
-
独自タグに囲まれた文字列の変換
-
PHPで「,」を「, 」へ置換した...
-
文字列の置換をCStringで(C++)
-
VBSで"をエスケープする文字は?
-
mcryptで英数字(12未満)のみに...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
テキストファイルから改行コー...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
グレープシティのSPREAD...
-
エクセルのCOUNTIFが正しくカウ...
-
UTF8メールがLotus Notesで文字...
-
jsp 改行コードで改行させて表...
-
ExcelVBAでメールを作成してメ...
-
C++で空Enterの入力を判...
-
csobjというタグについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
VBSで"をエスケープする文字は?
-
PHP・Wordpress preg_replaceを...
-
文字列の置換をCStringで(C++)
-
○分から○時間○分に変換
-
文字列の括弧について(初心者)
-
近似した文字列を置換するエク...
-
PHPの¥
-
ダブルクォーテーションが置換...
-
php 正規表現で、\\マークを取...
-
(から)までの文字列を削除したい
-
文字列のアスタリスク置換
-
htmlspecialchars関数でエスケ...
-
nl2brが効かないのですが・・・
-
PHPでCSVを出力する際のセルに...
-
c# string型の変数に、ダブルク...
-
正規表現で<BR>の行を除外した...
-
ダブル、シングルクォーテーシ...
-
空白文字のカンマへの変換について
-
【PHP】preg_replace() で正...
おすすめ情報