• ベストアンサー

(/)以降を取得する

$img = "<img src=\"test/aaa.jpg\">"; $res = array(); if(preg_match_all('/<img[^>]*src="([^"]+)[^>]*>/', $img,$res)){ print "<pre>"; print_r($res); print "</pre>"; } imgタグを検索し、imgタグがあった場合(/)以降のみ 取得したいのですが、そのような事は可能でしょうか? お分かりになる方よろしくお願い致します。

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

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

  • ベストアンサー
  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.2

> そもそも$resを出力すると > Array ( [0] => Array ( [0] => "×(画像)" ) [1] => Array ( [0] => test/tr/aaa.jpg ) ) > と出力されるのですが、なぜ配列にimgタグとパスが別々に格納されるのでしょうか…。 preg_match_allの仕様では$res[0]にパターン全体にマッチした文字列の配列、$res[1]に第1のキャプチャ用サブパターンにマッチした文字列の配列が格納されるようになってます。(※結果の返し方を指定しない場合) > (/)以降のみ取得したい というのは要するにディレクトリ部分を除去してファイル名のみを取得したいということでしょうか。 それなら以下のようにすれば良いかと。 <?php $html = "<img src=\"test/te/aaa.jpg\"><br/>\nabcdefg<br/>\n<img src=\"test/te/bbb.jpg\">"; $splitArr = array(); if(preg_match_all('/<img[^>]*src="([^"]+)[^>]*>/', $html, $res)){   foreach ( $res[1] as $str ){     printf( "file = [%s]\n", basename($str)) ;   } } ?> そうではなく、最初のディレクトリセパレータ以降の文字列を取りたいなら     printf( "file = [%s]\n", basename($str)) ; を       $splitArr = split(DIRECTORY_SEPARATOR, $str);     printf( "file = [%s]\n", join( array_slice($splitArr,1), DIRECTORY_SEPARATOR ) ) ; とか。

参考URL:
http://jp.php.net/manual/ja/function.preg-match-all.php
NeilMania
質問者

お礼

最悪入力する側に注意していただく形で 対応しようと思います。

NeilMania
質問者

補足

メッセージありがとうございます。 教えて頂いたソースで自分がやりたい事が出来るように なりました。ありがとうございます。 あともしお分かりになれば教えて頂きたいのですが、画像の 拡張子がjpgや,gifなどを条件に入れる場合どのように したらよいのでしょうか? <img[^>]*src="([^"]+)[^>][jpg|gif|png]*>/'>とやってみたのですが うまくいかず… 正規表現をすべて変更しないと出来ないものでしょうか…? 質問ばかりで申し訳ありませんが、よろしくお願い致します。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

imgタグを検索したのち、'/'をセパレータにしたSplitで分割すると配列になります。 要素数をカウントして、2個以上の場合の2番目以降が'/'の右側です。 複数の'/'があるなら要素が3個以上になっている点に注意してください。 必要に応じて '/'をはさんで連結すればOK。

NeilMania
質問者

お礼

メッセージありがとうございます。 /は固定で二つになります。 $img = "<img src=\"test/te/aaa.jpg\">"; $splitArr = array(); if(preg_match_all('/<img[^>]*src="([^"]+)[^>]*>/', $img,$res)){ $splitArr = split("/", $res); } とすると結果が Array ( [0] => Array ) になってしまうのですが… そもそも$resを出力すると Array ( [0] => Array ( [0] => "×(画像)" ) [1] => Array ( [0] => test/tr/aaa.jpg ) ) と出力されるのですが、なぜ配列にimgタグとパスが別々に格納されるのでしょうか…。 もしよろしければアドバイスお願いします。

関連するQ&A

  • 正規表現でタグの置換をしたいと試行錯誤しております。

    正規表現でタグの置換をしたいと試行錯誤しております。 もう1歩のところだと思いますがなかなかうまくいきません。 imgタグのsrcの中身を置換したいと思っております。 <img src="/uploads/abc.gif"><img src="/uploads/test/aaa.jpg"> 上記のタグを下記のように置換 <img src="cid:abc.gif"><img src="cid:aaa.jpg"> ディレクトリの部分を「cid:」とし、その後にファイル名とする。 preg_replace('/<img[^>]*src="([^"]+).+>/', "<img src=\"cid:$1\">", $body); 上記のようなコードにまではたどり着きましたがディレクトリの削除がうまくいきません。 良い方法があれば教えてください。

    • ベストアンサー
    • PHP
  • 「/」以降の取得について

    http://localhost/php/param.php/test 上の様なURL上から、「/」以降の文字の取得をしたいです。 以下の様に作成しましたが、実行結果、何も表示されません。 <?php $file = basename($_SERVER["PHP_SELF"]); $url = "http://" . $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI']; preg_match("/".$file."\/(.+$)/",$url,$match); $get = $match[1]; print $get; ?> 記述ミスでしょうか? 困っています。教えて下さい。

    • ベストアンサー
    • PHP
  • 配列の値について

    度々の質問で恐縮です。長時間かけて試行錯誤するものの一向に解決せず、お知恵をお借りできればと思い投稿させて頂きました。 ---------------- for ($i = 0; $i <= 2; $i++) { // 3回ループです。 if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { $pre = "s_"; $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i];   << 中略(色々な処理) >> if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir.$pre.$imgname[$i] ); $img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} 【A】} 【B】} 【C】 ----------------- ■上記『$img_thumb』には配列の値を格納していますが、【A】、【B】の位置で『print_r』を実施したところ、Array ( [0] => ××.jpg ) Array ( [1] => ○○.jpg )Array ( [2] => △△.jpg ) のように配列データが格納されていますが、【C】の位置では、Array ( [2] => △△.jpg ) だけしか表示されません。 これを【C】の位置でも全て表示できるようにするにはどうすればよいか、何かアドバイスをぜひともよろしくお願いいたします。 分かりにくくて申し訳ありません。

    • ベストアンサー
    • PHP
  • 文字列の中の特定部分とそうでない部分とで処理を分けたい

    文字列中で、<test>~</test>で囲まれた部分と、囲まれてない部分とで処理を分けたいです。 そして、分けて処理したあとに、くっつけたいです。 abcdEFG <test> ABCDEFG </test> hiJKLmn ↓ 例えば、<test>で囲まれた部分は小文字に変換、囲まれていない部分は大文字に変換という処理であれば以下のようにしたいのです。 ABCDEFG <test> abcdefg </test> HIJKLMN 扱う文字列は、UTF-8で複数行です。 自分でとりあえず動作するコードは作成してはみたものの、、、 あまりスマートとはいえないと感じていて、もっといい方法があればご教示お願いしたいです。。。 1.文字列Aの中から、<test>で囲まれた部分をpreg_match_all()で取得し、変数Aに格納。 2.変数Aに処理を加え、変数Bに代入。 3.preg_replace()で文字列Aの中の、変数A部分を変数Bに置換。 4.文字列Aを、<test>で囲まれた部分をキーとしてpreg_split()で分解し、変数Aに格納。 5.変数Aに処理を加え、変数Bに代入。 6.preg_replace()で文字列Aの中の、変数A部分を変数Bに置換。   $pre1 = array();   $pre2 = array();   preg_match_all("/<test>((.|\r\n|\n)*?)<\/test>/u", $p_string, $pre1);   for ( $x = 0; $x < count($pre1[0]); $x++ ) {     # $pre1[0]ではなく$pre1[1]としてるのは<test>タグを含めないため     $pre2[$x] = $pre1[1][$x];     # hoge*()は処理     $pre2[$x] = hoge2( $pre2[$x] );     $pre2[$x] = hoge4( $pre2[$x] );     # <test>タグを戻して、置換後の文字列完成・・・(1)     $pre2[$x] = '<test>'.$pre2[$x].'</test>';     # 置換パターン・・・(2)     $pre1[0][$x] = "/" . preg_quote($pre1[0][$x], "/") . "/u";   }   # 文字列から、(2)置換パターンを探して、(1)置換後文字列に置き換え   $p_string = preg_replace( $pre1[0], $pre2, $p_string );   $pre1 = array();   $pre2 = array();   $pre1 = preg_split("/<test>(.|\r\n|\n)*?<\/test>/u", $p_string, -1, PREG_SPLIT_NO_EMPTY);   for ( $x = 0; $x < count($pre1); $x++ ) {     $pre2[$x] = $pre1[$x];     # hoge*()は処理     $pre2[$x] = hoge1( $pre2[$x] );     $pre2[$x] = hoge2( $pre2[$x] );     $pre2[$x] = hoge3( $pre2[$x] );     # 置換後の文字列完成・・・(3)     $pre2[$x] = hoge4( $pre2[$x] );     # 置換パターン・・・(4)     $pre1[$x] = "/" . preg_quote($pre1[$x], "/") . "/u";   }   # 文字列から、(4)置換パターンを探して、(3)置換後文字列に置き換え   $p_string = preg_replace( $pre1, $pre2, $p_string );   # 最後に<test>タグを削除する   $p_string = preg_replace( "/<test>((.|\r\n|\n)*?)<\/test>/u", $1, $p_string );

    • ベストアンサー
    • 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
  • preg_match_allで取得データをDBへ

    質問:preg_match_allで取得したデータをDBへ格納したいです。 記述文 $pattern = "|HREF=.*?\>|"; preg_match_all($pattern,$str,$match); 補足: $pattern で指定範囲を書いてます。 $str には $patternでとってくる参照データ先が入ってきます。 print_r($match); で念のためブラウザに吐き出すと Array ( [0] => Array ( [0] => HREF="AAA"> [1] => HREF="../../../../Top"> 以下省略 取得したい範囲が取れていることは確認できました。 目的は、とってきた [0] => HREF="AAA"> [1] => HREF="../../../../Top"> : =>より先の文字列が、DBの1つのレコードに1つずつ入っていくイメージです。 アドバイスよろしくお願いします。

    • ベストアンサー
    • 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
  • カンマ区切りの数字で指定したものだけを取り出したいです。

    カンマ区切りの数字で指定したものだけを取り出したいです。 $test = "1,2,3,5,10,11,14" という文字列から、1だけを取り出したい場合、どうしたらよいのでしょうか。 preg_match_all("/(?<!1)1(?!1)/",$test,$match); print implode($match[0]); としてますが、なぜか10,11,14と1が含まれるもの全てが表示されてしまいます。

    • ベストアンサー
    • PHP
  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • img のソース変更

    IMGタグの画像データ(***.JPG)を変更したいときは、どうしたらいいでしょうか? 以下のサイトを参考にしましたが、いまいちよくわかりませんでした。 http://bibo-roku.net/1301/78.php <IMG SRC="AAA.JPG"> <IMG SRC="BBB.JPG"> をPHPで <IMG SRC="CCC.JPG"> に変更する方法を教えてください よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう