画像置換えの方法を教えてください
- プログラム初心者の方に、正規表現を使用して画像の置換えを行う方法をお教えします。
- 拡張子がgif、png、jpgの画像の番号を正規表現で検索し、テキストを置き換えます。
- 具体的な例を示しています。
- ベストアンサー
画像の置換え
プログラム初心者です 番号と画像拡張子を簡単な正規表現で表す方法をおしえてください 拡張子はgif、png、jpgの拡張子です 番号は桁数も番号も変わります。この三パターンにマッチするテキストを置き換えたいです 例 56.gif 100.gif 6.png 6549.png 79169.jpg 35.jpg $pattern="/(\d+)/"; $replacement="<a href=\"$0\">$0</a>"; if(preg_match($pattern,$mes,$matches) ){ $mes=preg_replace($pattern,$replacement,$mes); } よろしくお願いします
- flash0
- お礼率97% (297/306)
- PHP
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
1つの文字列中にまとめて存在しているならば $pattern = '/\b\d++\.(?:png|gif|jpe?+g)\b/i'; それぞれが別の文字列として独立しているならば $pattern = '/\A\d++\.(?:png|gif|jpe?+g)\z/i'; として、 $mes = preg_replace($pattern, '<a href="$0">$0</a>', $mes); で動作します。preg_matchを行う必要はありません。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
微妙にずれている気がしますが、こんな感じで? <?PHP $mes=<<<EOF xxx56.gifxxx100.gifxxxx 6.png yyy123.bmpyyy6549.pngyyy 79169.jpg zzz35.jpgzzz EOF; print nl2br(htmlspecialchars($mes)); print "<hr>"; $pattern = "/\d+.(?:png|gif|jpg)/mis"; $replacement="<a href=\"$0\">$0</a>"; $mes=preg_replace($pattern,$replacement,$mes); print nl2br(htmlspecialchars($mes));
お礼
回答ありがとうございます こちらも、ばっちり動きました!感謝いたします
- yambejp
- ベストアンサー率51% (3827/7415)
英字+数字+拡張子の場合どこまでヒットさせるかなど もう少し仕様を詰めた方がいいですね たとえば「xxx1.jpg」は「1.jpg」をヒットさせるのか、 それともヒットさせないのか
お礼
回答ありがとうございます 1.jpgはヒットさせる予定です 数字+拡張子なので 1.jpg、11.jpg、111.jpgなど桁数も変わってしまいます。番号も変わります 拡張子は3つのみです
関連するQ&A
- 複数の配列をまとめて昇順で表示
//商品番号 $pattern1 = "/<b><font color=\"#000000\">(.*)<\/font><\/b>/"; //商品番号(ランダム) preg_match_all($pattern1, $homepage, $matches1); //商品名 $pattern2 = "/<font size=\"2\"><a href=\".*\">(.*)<\/a><\/font>/"; //商品名 preg_match_all($pattern2, $homepage, $matches2); 上記のように、$matches1には商品番号がで$matches2には商品名のデータが入っています。 商品番号:$matches1[1][0] の商品は$matches2[1][0]になります。 商品番号の順番は昇順ではなくユニークな数値がランダムで入っています。 これをひとつの配列にまとめて、商品番号ソートをかけて表示したいのですが。 最終的な表示は 商品番号:商品名 001:りんご 002:バナナ 003:メロン よろしくお願いします。
- ベストアンサー
- PHP
- 置換え
プログラム初心者です 文字を参照でつかおうとおもったんですがつかえませんでした $row_cntは投稿したレス番号です レス番号と引用した数字が同じ場合は置換えないようにしようとおもいました $noに入っている文字がなにか確認したら参照した数字ではなくて文字の$1になってました。 どうやったら参照した数字を変数にいれられるでしょうか? $pattern="/>>(\d+)/"; $no= "$1"; if($row_cnt!=$no){ $replacement="<a href=\"bbs.php?no=$1\">$0</a>"; $str=preg_replace($pattern,$replacement,$mes); } よろしくおねがいします
- ベストアンサー
- PHP
- preg_replace_callback が渡す変数の扱い
preg_replcace_callback を使用して、<a>タグ内のURLの字数を制御するコードに取り組んでいます。詳しい方アドバイスしてくださると助かります。 下のコードの、shorten(カスタム関数)に渡されるデータが配列なのですが、並列に並んだ配列のようなのです。echo をかけてみると、ArrayArray と表示されます。しかし、Array([0]=>Array [1]=>Array) ではないので、どうやって 処理をかけて return すればよいのか途方にくれています。 もしよい方法をご存知の方おられましたらどうぞよろしくお願いいたします。 <? $str = <<<HERE //長いURLのサンプルです。ここの掲示板の処理で途中で表示がカットされていますが、<a href="http://長いURL">http://長いURL</a>という構成になっています。 <a href="http://gooooooooooooooooooooooooooooooooooogle.co.jp">http://gooooooooooooooooooooooooooooooooooogle.co.jp[</a> <a href="http://yahooooooooooooooooooooooooooooooooooo.co.jp">http://yahooooooooooooooooooooooooooooooooooo.co.jp</a> HERE; $pattern = "#<a(.*?)>(.*?)<\/a>#s"; $str = preg_replace_callback($pattern, 'shorten', $str); echo $str; function shorten($matches) { foreach($matches as $index => $match) { if (strlen($match) > 20) { $matches[$index] = substr($match, 0, 20) . '....'; } } return $matches; } ?>
- ベストアンサー
- PHP
- HTMLの許可
プログラム初心者です 簡単な掲示板を作りました 一部のHTMLのタグを許可する方法を教えてください 素人なりに考えたのですが、一回タグをすべて無効化して<code>にしてから許可したいタグにマッチした文字だけをHTMLにすればどうかなと思ったんです 質問1 これで、セキュリティ的に安全ですか? 質問2 10個くらいのタグを置き換えると負荷は重そうですか?メッセは最大2000文字程度です <?PHP $mes//投稿されたメッセ(タグは除去済み) $pattern="/<code>/"; $replacement="<code>"; preg_replace($pattern,$replacement,$mes); $pattern="/</code>/"; $replacement="</code>"; preg_replace($pattern,$replacement,$mes); ?> 許可したいタグは、b、code、tableなどのタグなどです 質問3 もっと他にいい方法があればお願いします よろしくお願いします
- ベストアンサー
- PHP
- PHP正規表現の難題・preg_replaceでイメージタグをリンクタグに…
PHPのpreg_replaceを使用して、 imgタグをaタグに置換するプログラムで躓いています。 全てのパターン$hogeで適用される正規表現をかけません。 (※現在パターン1のみ出来ない状況で困っています) 間違い箇所ありましたらご教授下さい。 ■パターン1 $hoge = '<img src="http://test.jp/test.gif" class="test" style="border:none;" />'; ■パターン2 $hoge = '<img src="http://test.jp/test.gif">'; ■パターン3 $hoge = '<img width="100" src="http://test.jp/test.gif">'; preg_replace('/\<img(.*)src=\"?(http[\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png|bmp))\"(.*)\>/i',"<a href='\\2'>link</a>",$hoge); どうぞよろしくお願い致します。
- ベストアンサー
- PHP
- preg_replace 後方参照
preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){ $str = preg_replace("/^\d+/", "", $str); $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? ( perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )
- ベストアンサー
- PHP
- PHPのpreg_replaceについて
文字列に半角、全角があったら''に置換したいです。 例)あ あ あ -> あああ 上記のように。 ソースは下記のとおりしてみたのですがうまく表示されませんでした。 $string = 'あ あ あ'; $pattern = '[ \t\n\r\f]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); 他には $string = 'あ あ あ'; $pattern = '[[:space:]]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); などと行ってみました。 ご教授お願いいたします。
- 締切済み
- PHP
- preg_replace()でマッチ文字列に関数を
PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。
- ベストアンサー
- PHP
- phpでファイルの先頭8バイトだけで画像の形式を調べる
phpでファイルの先頭8バイトだけで画像の形式を調べる phpで画像の形式を調べる方法について http://labs.gmo.jp/blog/ku/2007/05/8.html のページを参考に、php5にて以下のようなコードを書いてみました。 //アップロードされたファイルを読み込み $fp = fopen($_FILES["upfile"]["tmp_name"],"rb"); $imgdata = fread($fp,filesize($imgfname)); fclose($fp); //画像形式判定 echo getImageType($imgdata)."形式と思われます\n"; function getImageType($dat){ if ( preg_match( '/^x89PNGx0dx0ax1ax0a/', $dat) ) { $type = "png"; } elseif ( preg_match( '/^GIF8[79]a/', $dat) ) { $type = "gif"; } elseif ( preg_match( '/^xffxd8/', $dat) ) { $type = "jpg"; } return $type; } ところが、png/gif/jpegいずれの画像でテストしてもgetImageTypeの結果が""となってしまい、正常に判定することができません。 修正点などご教授いただければ幸いです。
- ベストアンサー
- PHP
- 文字列を抜き出して置換
《../img.jpg》 と言う文字列を <a href="../img.jpg"><img src="../img.jpg"></a> と言う具合に置き換えて書き出したいのですが、 $text="テスト文章《img.jpg》<br>テスト文章《test.gif》"; $test01=(strpos($text, "《")+2); $test02=(strpos($text, "》")-$test01); $test03=substr($text,$test01,$test02); $test04="<a href=\"".$test03."\"><img src=\"".$test03."\"></a>"; $test_txt=str_replace($test03,$test04,$text); これだと、 「テスト文章<a href="img.jpg"><img src="img.jpg"></a><br>テスト文章《test.gif》」 となってしまい、《../img.jpg》が複数個ある場合の処理がうまく出来ず困っています。 ループ処理すればいいのでしょうけど、どのような方法が適切なのか分かりません。 また、これ以外の方法「preg_match()」などで、いい方法がありましたら、ご教授よろしくお願いします。
- ベストアンサー
- PHP
お礼
回答ありがとうございます ばっちり動きました!さすがです