• ベストアンサー

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); だれか知ってる方何卒宜しくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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://がないので置換されないんだと思います。 なんでこんな複雑なことをしなければいけないかといいますと、 掲示板のレンタルなので大元のフォルダ名がころころ変わるので、大元のフォルダ名を自動で取得しないといけないところにあります。 簡単にできそうで簡単じゃなかったみたいです。

関連するQ&A

  • URLを見つけたら自動でリンク、タイトルを取得する

    よろしくお願い致します。 ------------- 引用元:http://aaa、http://bbb、http://ccc ------------- という文字列がある場合 ------------- 引用元:<a href="http://aaa" target="_blank">タイトルaaa</a>、<a href="http://bbb" target="_blank">タイトルbbb</a>、<a href="http://ccc" target="_blank">タイトルccc</a> ------------- に置き換える方法を考えています。 ------------- <?php // 対象文字列 $text = '引用元:http://aaa、http://bbb、http://ccc'; // パターン $pattern = '/((?:https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/u'; // 置換後の文字列 $replacement = '<a href="\1">\1</a>'; // 置換 $text= preg_replace($pattern,$replacement,$text); // 出力 echo $text; ?> ------------- で ------------- 引用元:<a href="http://aaa" target="_blank">http://aaa</a>、<a href="http://bbb" target="_blank">http://bbb</a>、<a href="http://ccc" target="_blank">http://ccc</a> ------------- までは行けたのですが、タイトルを取得する方法が分かりません。 http://otapps.net/archives/305 こちらを参考に考えたのですが、先に進めずにいます。 分かる方がいらっしゃいましたら、ご教示ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP5.3以降のereg_replaceについて

    PHP5.3以降にアップデートしたところ、ereg_replaceで書かれている箇所で警告が出るようになりました。 マニュアルを見た限りではpreg_replaceへの移行が推奨されているようなので、preg_replaceに書き換えようと思い、http://melma.com/backnumber_129036_1571788/を参考に、2つ目のパラメータの前後に/を付けましたが、画面に何も表示されず、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、ソースは下記となります。 また、記述はhttp://okwave.jp/qa/q849820.html?&status=true&errcode=&msg=&qid=849820を使用させていただいており、やりたいことはURLに自動的にハイパーリンクを付加したいという状況で、ereg_replaceを使用すればできております。 <?php $proto = "私のブログはhttp://www.hoge.com/です。"; $proto = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$proto); //$proto = preg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","/<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>/",$proto); print $proto; ?> 以上、宜しくお願いします。

    • ベストアンサー
    • PHP
  • 秀丸エディタでHTMLの部分のURLだけ抜き出したい。

    秀丸エディターを使って <img src="/image/cam.gif"></td><td align=center nowrap><a href="http://aaa.com/1111"><a href="http://aaa.com/2222"><a href="http://bbb.com/1111"><a href="http://bbb.com/3333">....................... のURL部分の http://aaa.com/1111 http://aaa.com/2222 http://bbb.com/1111 http://bbb.com/3333 の部分だけを抜き出したいと思います。 よろしくお願いします。

  • phpでpreg_replaceで次のような条件の文字を置換したいのですが…

    <a href="jump?url= *1 " target="_blank"> *2 </a> というAタグになっている文字列を *2 だけのテキストにしたいと思っています。 preg_replaceでの正規表現での条件がわかりません…。

    • ベストアンサー
    • PHP
  • preg_replace関数のtarget属性

    ○質問の主旨 preg_replace関数の引数の一部にある<a>タグ内の target属性を"_blank"にしていますが、新しいウィンドウが開かず、 元の画面のまま、href属性のリンク先に遷移します。 新しいウィンドウにhref属性のURLを表示させるためには どうすれば良いでしょうか? ご存知の方がいらっしゃいましたら、ご教示願います。 ○質問の補足 現在、以下のようなコードを用いています。 $tweet['text']=preg_replace("/(http:\/\/t.co\/[a-zA-Z0-9]{10})/", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $tweet['text']); $tweet['text']とは、Twitter RESTAPI1.1のGET search/tweetsから ひっぱってきた文字列で、ツィート本文のことです。 コード全体の意味は、 「ツィート本文にhttp://t.co/○○○○○○○○○○という文字列があれば、 そのリンク先にtarget=_blankで遷移しなさい」 ということになります。 以上、よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • タグの中の改行文字を正規表現で削除したい

    たとえば、 <a href="~" target="_blank"> というタグの中の改行文字(\n)を削除する正規表現を教えてください。 ただし、preg_replace_callbackは使わないでください。

    • 締切済み
    • PHP
  • 正規表現でpreg_系を使ってタグ内は置き換えないようにする方法

    正規表現でpreg_系を使って、半角スペースを&nbsp;に置き換える処理をしたのですが、タグ内のスペースも&nbs;に置き換わってしましました。 タグ内は置き換えないようにするにはどのようにしたら良いでしょうか? データは複数行渡っています。以下はタグが置き換わるので、逆にタグでないものを置き換えたいです。 <?php function test_call($matches){ return str_replace(" ","&nbsp;",$matches[0]); } $data = <<< EOT この横は変換 します。 <a href="http://www.yahoo.co.jp/" target="_blank">タグの半角スペースは変換せず、 この横は変換する。 </a> このタグも変換してはいけません。< br/> EOT; $data = preg_replace_callback('/<("[^"]*"|\'[^\']*\'|[^>])*>[ ]?/', "test_call", $data); var_dump($data); ?>

    • ベストアンサー
    • PHP
  • preg_replaceでタグだけ置換

    HTMLのタグを別のタグに置換しようとしています。 HTML中に複数ある<a></a>タグ <a href="/w/index.php?title=%E3%83%95%E3%82%B0%E3%83%AA%E3%83%BC%E5%B7%9D&amp;action=edit" class="new" title="フグリー川">フグリー川</a>など という文字列の<a></a>タグを<span style="color:#ff0000;"></span>に置換したいのです。 $pattern = '|<a href="/w/index\.php\?title=.*?">(.*)</a>|'; $replace = '<span style="color:#ff0000 ;">\\1</span>'; preg_replace( $pattern, $replace, $html, -1, $count); print $count; $countの表示は 1 でした。上記のような<a>タグは複数あるのに。 上記のような<a>タグをマッチさせるにはどうパターン表記したらいいでしょうか? PHP5.2.4です。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • リンクからのPOST送信について

    <a href="hoge.cgi?aaa=bbb">hoge</a> この場合、リンクをクリックしたらGETで送られるとおもうのですが、 POSTで送るにはどうしたらいいのでしょうか?

    • ベストアンサー
    • Perl
  • gaiaxでアクセス解析

    すごいカウンターをレンタルしたのですが全く表示されません。 java scriptなのですが、gaiaxでは無理でしょうか? 手直しする方法はないでしょうか? どうしても使いたいんです。 教えてください。よろしくお願いします。 ↓これです。 <script language="JavaScript"> var rf; ref=escape(document.referrer)+""; if( (ref=="undefined") || (ref=="") ){ ref="bookmark";} document.write(''+ '<a target="_blank" href="http://fc2.com">'+ '<img border=0 src="http://www.******.com:10000/cgi-bin/counter.***?'+ 'id=100638'+ '&page=1'+ '&ref='+escape(ref)+ '&x='+screen.width+ '&y='+screen.height+ '&cols='+screen.colorDepth+ '&uniq=0'+ '&cnt=3'+ '"></a>'); </script> <noscript> <img border=0 src="http://www.******.com:10000/cgi-bin/counter.***?id=100638&page=1&uniq=0&cnt=3"> </noscript>