• ベストアンサー

preg_replace

$img_ref = '<a target="_blank" href="http://aaa/aaa/.com/'.$_POST[bbs].'/img/'.$_POST['key'].$imgnum.$tail.'">'; 上記みたいな画像掲示板のスクリプトの画像URLリンク先を示す箇所で、preg_replaceを使って「http://」と「aaa/aaa.com」の間にbbb/bbb/image.cgi?を入れたいと思います。 ↓こんな感じかなーと思いつつあやっぱりできません。 $img_ref = preg_replace("/(https?):\/\/([\w;\/\?:\@&=\+\$,\-\.!~\*'\(\)%#]+)/", "<a href=\"$1://bbb/bbb/image.cgi?$2\" target=\"_blank\">", $img_ref); だれか知ってる方何卒宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

a の中の href と target の順番も逆にしたいのでしょうか? もし元のままでもいいのなら、 $img_ref = preg_replace("|(https?)://([\w;/?:@&=+$,\-.!~*'()%#]+)|", '$1://bbb/bbb/image.cgi?$2', $img_ref); こんなんで <a target="_blank" href="http://bbb/bbb/image.cgi?foo/bar/example.com/random-bbs /img/imgkey/4649.jpg"> こういう出力になりますけど。 変数を使った形ではなく、その内容が展開されていて置換を行う直前の文字列と それをどのようにしたいのかという例を出していただけると話が早いと思います。 余計なメモ preg は、/ 以外でも区切りのキャラクターとすることができます(上記の例では|にしています)。 []のなかではたいていのメタ文字は特殊な意味がなくなりますから、 なんでもかんでも \ をつけないようにしたほうが正規表現が読みづらくなりません。 あと、外からの入力を無条件に信頼しないほうがいいんじゃないかなあ。

gachoon3
質問者

お礼

どうもありがとうございます。 ちなみに http://aaa.com/bbs/aaa/board/img/12358283140009.jpg ↓ ​http://bbb.com/bbs/image.cgi?http://aaa.com/bbs/aaa/board/img/12358283140009.jpg こういった形に置換したかったのです。 (URLの前にhttp://bbb.com/bbs/image.cgi?をつける) でもやっぱりうまくいきませんでした。

その他の回答 (1)

  • bflo
  • ベストアンサー率0% (0/1)
回答No.2

str_replace('href="http://','href="http://bbb.com/bbs/image.cgi?http://',$img_ref); はどうでしょう? httpsにも対応したい場合は、preg_replaceを使うことにはなると思いますが。 ※http://...と記入するとOKWAVEによって勝手にリンク化されてしまうので、三箇所のコロン(:)をわざと全角にしています。 もし採用していただける場合はhttp:// は http:// に直してください。

gachoon3
質問者

お礼

ありがとうございます。 でもやっぱりできませんでした。 よく考えたら根本的な問題がわかりました。 $img_refが相対パスなので、それを絶対URLに変えないとhttp://がないので置換されないんだと思います。 なんでこんな複雑なことをしなければいけないかといいますと、 掲示板のレンタルなので大元のフォルダ名がころころ変わるので、大元のフォルダ名を自動で取得しないといけないところにあります。 簡単にできそうで簡単じゃなかったみたいです。