- ベストアンサー
(/)以降を取得する
$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タグがあった場合(/)以降のみ 取得したいのですが、そのような事は可能でしょうか? お分かりになる方よろしくお願い致します。
- みんなの回答 (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 ) ) ; とか。
その他の回答 (1)
- bin-chan
- ベストアンサー率33% (1403/4213)
imgタグを検索したのち、'/'をセパレータにしたSplitで分割すると配列になります。 要素数をカウントして、2個以上の場合の2番目以降が'/'の右側です。 複数の'/'があるなら要素が3個以上になっている点に注意してください。 必要に応じて '/'をはさんで連結すればOK。
お礼
メッセージありがとうございます。 /は固定で二つになります。 $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タグとパスが別々に格納されるのでしょうか…。 もしよろしければアドバイスお願いします。
お礼
最悪入力する側に注意していただく形で 対応しようと思います。
補足
メッセージありがとうございます。 教えて頂いたソースで自分がやりたい事が出来るように なりました。ありがとうございます。 あともしお分かりになれば教えて頂きたいのですが、画像の 拡張子がjpgや,gifなどを条件に入れる場合どのように したらよいのでしょうか? <img[^>]*src="([^"]+)[^>][jpg|gif|png]*>/'>とやってみたのですが うまくいかず… 正規表現をすべて変更しないと出来ないものでしょうか…? 質問ばかりで申し訳ありませんが、よろしくお願い致します。