人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpの置き換えに付いて教えて下さい。

ここから<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" />ここのように



<a href="x.html">ここ</a>から<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" /><a href="x.html">ここ</a>のように

とする置き換えるコードを教えて下さい。

「ここ」をリンクにしたいのですが、aタグの中と、alt属性の値部分は置き換えないようにしたいのです。

よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●20ポイント

一例

<?php
// データ準備
$t = 'ここから<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" />ここのように';

// 置換パターン準備
$p = array(
 '!ここ!',
 '!(a.+?)<a href="x.html">ここ</a>!'
);
$r = array(
 '<a href="x.html">ここ</a>',
 '$1ここ'
);
// 置換と出力
echo preg_replace($p, $r, $t);


//下記と同じ意味になっています。
echo preg_replace('!(a.+?)<a href="x.html">ここ</a>!', '$1ここ', preg_replace('!ここ!', '<a href="x.html">ここ</a>', $t ) );

出力結果

<a href="x.html">ここ</a>から<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" /><a href="x.html">ここ</a>のように

TransFreeBSDさんのコメント
おー!と思ったのですが、弱点が。 http://ideone.com/dN9Jo 普通のaがあると目的のまで再置換されてしまいます。

worldtravelさんのコメント
ありがとうございます。

うぃんどさんのコメント
弱点の箇所については、 alt="ここ画像" があったのでわざと < を省いています。 alt="ここ画像"の記述がないのであれば下記のように < を加えます。 >|| $p = array( '!ここ!', '!(<a.+?)<a href="x.html">ここ</a>!' ); ||< 実際のテキストはもっと複雑でしょうから、 自身で修正しやすいように、 簡単な正規表現で出来ることを考慮しています。 コメントすると改行位置で変な文字が混じるので一行に書き直しました。

2 ● TransFreeBSD
●80ポイント ベストアンサー

http://ideone.com/SdAOd
基本は「(<a.*?<\/a>)|(ここ)」と同じですが、ちょっと改良したのと、「<.*?\>」(phpなので念のため>をエスケープしてます)というパターンを追加してます。
「<a.*?<\/a>」は「<(a)\b.*?<\/\3>」とすることで

となってます。二つ目は不要かもしれませんが、たとえばコメントアウトしてあるやつのように、「(a)」を「(a|textarea)」とすればaタグ以外にtextareaタグに囲まれている部分も置換しなくなります。
追加したパターンが「<.*?\>」なので

実用的にはこちらの方だろうと思います。もしimgに限定したいなら「<img\b.*?\>」になります。
あと、修飾子eに加えてiも指定してるので、タグが大文字でも対応します。
#面倒なので<>はすべて<>に変換してます。

<?php
$path = "x.html";
$string = fgets(STDIN);
$patterns = '!(ここ)|(<(a)\b.*?</\3>|<.*?\>)!ie';
//$patterns = '!(ここ)|(<(a|textarea)\b.*?</\3>|<.*?\>)!ie';
$replace = '"\1"?"<a href=\"$path\">\1</a>":"\2"';
echo preg_replace($patterns, $replace, $string);
?>

worldtravelさんのコメント
ありがとうございます。 これから試してみます。

worldtravelさんのコメント
上手く行きました! ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ