HTMLファイルを読み込み、特定の文字列にリンクを付けて出力したいのですが上手くいきません。
例: <img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
↓正規表現をキーワードにしてリンクを付けたい。
正:<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
誤:<img src="./seiki_hyougen.gif" alt="<a href="seiki_hyougen.html">正規表現</a>についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html"><a href="seiki_hyougen.html">正規表現</a>の詳しい説明</a>をクリックして下さい。
尚、下記URLのサンプルを参考にしてスクリプトを作成しています。
http://php.oss.eznetsols.org/manual/ja/function. …
$r = preg_split('((\/a>)|(<a))', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($r); $i++) {
if ($r[$i] == "<a") {
$i++; continue;
}
$r[$i] = preg_replace(
"/(正規表現)/i", "<a href='seiki_hyougen.html'>\\1</a>", $r[$i]
);
}
return join("", $r);
この(正規表現)の部分で上手い正規表現を使えばalt="×××"の中にリンクタグが入らないようにできるのでは?と思っているのですが・・・。
どうか、良い方法を教えて下さい。よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
ごめんなさい。
複数のキーワードに対応しようとして余計なことをしてしまいました。
訂正します。
<?php
$msg = <<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;
$links = array (
'正規表現' => '<a href="seiki_hyougen.html">正規表現</a>',
);
$link_keys = array_keys($links);
$link_values = array_values($links);
# 表示用関数
function printandreturn ($str) {
print stripslashes("$str");
return "";
}
function printwithlink ($str) {
global $link_keys, $link_values;
print str_replace($link_keys, $link_values, stripslashes($str));
return "";
}
# 処理開始
# 文字化け対策
$msg = str_replace("\\", "\\\\", $msg);
# メインループ
while (strlen($msg)) {
# アンカー部分をスキップ
if (strpos($msg, '<a') === 0) {
$msg = preg_replace("|^(.*?</a>)|e", "printandreturn ('$1')", $msg);
continue;
}
# タグ部分をスキップ
if ($msg[0] == '<') {
$msg = preg_replace("|^(<.*?>)|e", "printandreturn ('$1')", $msg);
continue;
}
# 次のタグまでをリンク付きで表示
foreach ($links as $key => $value) {
$msg = preg_replace("|^([^<]+)|e", "printwithlink ('$1')", $msg);
}
}
?>
回答ありがとうございます。
複数のキーワードに対応させようと思っていたので下記回答も大変に有用な情報になりました。
いろいろな切り口があるな~と関心して回答を拝見しました。
なかなか回答が得られなかったので、
<?php
$html=<<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;
$r = preg_split('((\/a>)|(<a))', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($r); $i++) {
if ($r[$i] == "<a") {
$i++; continue;
}
$r1 = preg_split('(alt=\".*?\")', $r[$i], -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i1 = 0; $i1 < count($r1); $i1++) {
$r1[$i1] = preg_replace(
"/($word1)/i", "<span class='hilite'>\\0</span>", $r1[$i1]
);
}
$r[$i]=join("", $r1);
}
$html=join("", $r);
?>
というようなスクリプトを考えました。
autumnskyさんのスクリプトも参考にしながらよりよい処理にしたいと思います。
ありがとうございました!
No.3
- 回答日時:
かなり富豪的なので重そうですが…
特に終了条件が危険なので自信ないです。
<?php
$msg = <<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;
$links = array (
'正規表現' => '<a href="seiki_hyougen.html">正規表現</a>',
);
# 表示用関数
function printandreturn ($str) {
print stripslashes("$str");
return "";
}
function printwithlink ($str, $key, $value) {
print str_replace($key, $value, stripslashes($str));
return "";
}
# 処理開始
# 文字化け対策
$msg = str_replace("\\", "\\\\", $msg);
# メインループ
while (strlen($msg)) {
# アンカー部分をスキップ
if (strpos($msg, '<a') === 0) {
$msg = preg_replace("|^(.*?</a>)|e", "printandreturn ('$1')", $msg);
continue;
}
# タグ部分をスキップ
if ($msg[0] == '<') {
$msg = preg_replace("|^(<.*?>)|e", "printandreturn ('$1')", $msg);
continue;
}
# 次のタグまでをリンク付きで表示
foreach ($links as $key => $value) {
$msg = preg_replace("|^([^<]+)|e", "printwithlink ('$1', '$key', '$value')", $msg);
}
}
?>
No.2
- 回答日時:
こんにちは。
えっと、以下のような感じがおっしゃられている条件にある程度似ているテストにはなると思います。
<?
$beforeMsg = <<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;
$afterMsg = preg_replace("/[^\">](正規表現)/" , "<a href=\"seiki_hyougen.html\">\\1</a>" , $msg);
print $afterMsg;
?>
ただですね・・・、私の環境
OS:Linux , PHP:ver5 , 文字コード:UTF
OS:Windows , PHP:ver4 , 文字コード:EUC
で、実験したんですけど文字化けを起こしますね・・・。
$afterMsg = stripslashes(preg_replace("/[^\">](正規表現)/" , "<a href=\"seiki_hyougen.html\">\\1</a>" , $msg));
とやってみたり、
ereg_replace('[^">](正規表現)' , "\<a href='seiki_hyougen.html'>\\1</a>" , $msg);
など色々やってみたんですけど、文字化けするようです・・・。
すいません。原因はわかりません・・・。
ただ考え方こんな感じです。正規表現の場合は「文字列」を置換するのではなく「パターンにマッチした文字列」を置換する。と、いった考え方です。
今回は、『「正規表現」という文字列』ではなく、『「"」か「>」が前につかない「正規表現」というパターン』を置換する。
文字コードが「UTF」であれば、パターン修正子に「u」を指定してみてください。
今回は、
"/[^\">](正規表現)/u" ←iだと、大文字小文字区別なくになります。
この回答への補足
↓campanella_77さんへの回答に対するお礼に誤りがありました。
<img src="./seiki_hyougen.gif" alt="えーと、<a href=\"seiki_hyougen.html\">正規表現</a>についての説明">
が発生する・・・でした。
回答ありがとうございます。
しかしながら、お答え頂いたスクリプトだと、
<img src="./seiki_hyougen.gif" alt="<a href=\"seiki_hyougen.html\">正規表現</a>についての説明">
が発生してしまうと思います。
質問させて頂いたスクリプトの「(正規表現)」部分にalt=""内の文字列"正規表現"は一致させないような正規表現を求めています。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- SEO googleサーチコンソールで、重複URLが多数発生、その修正方法について 2 2023/06/23 16:15
- PHP PHP MySql ページング 2 2022/09/20 06:38
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csobjというタグについて
-
正規表現でHTMLタグの属性まで...
-
reuterの記事をbeautiful.soup....
-
HTML・特定のタグの使用可能か...
-
objective-cでのHTMLタグ表示に...
-
VBAのコマンドボタンの文字列の...
-
テキストファイルから改行コー...
-
C++で空Enterの入力を判...
-
LaTeX: captionの中で改行した...
-
VC++ マルチバイト文字とUniCod...
-
JAVA System.out.println の ...
-
fgetsとsscanf
-
エスケープ文字の復帰(¥r)と...
-
VBAでCSVをExcelに取り込む時に...
-
VB.net テキストボックス半角文...
-
VB6でブラウザのページソースを...
-
C++のctime関数復帰値の改行
-
正規表現での英字+ハイフンの...
-
エクセルのCOUNTIFが正しくカウ...
-
【Tex】\\verbatiminputについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
reuterの記事をbeautiful.soup....
-
JSFタグのfタグとは
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
phpの正規表現でstyle="●●"を削...
-
Nvuで作成したhtmlをコピペして...
-
正規表現で指定範囲すべて除去...
-
正規表現でタグの置換をしたい...
-
Strutsでリンクを動的に生成したい
-
自分でタグ打ちして作ったペー...
-
php正規表現 相対パス→絶対パス
-
ASP.NET(C#)とhtmlの#include
-
PHPの正規表現でHTMLタグの内容...
-
csobjというタグについて
-
VBSでのhtmlタグ要素名の置換
-
htmlタグ間の特定文字置換
-
URLの連続アクセス
-
HTMLファイルの書き換え
-
htmlspecialchars関数を使いな...
-
javascriptの正規表現でhtmlか...
おすすめ情報