こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

preg_match_allで正規表現

preg_match_allにて、次のように<img>が連続したソースから、

※URLは全てダミーです
<img src="http://a.com/a/a.jpg"><img width="10" src='http://b.com/b/b.gif' height="10"><img width="10" height="10" src='http://c.com/c/c.png"><img src=http://d.com/d/d.jpg><img src="http://e.com/hogefuga/e.jpg">


個々のimgタグ全体と"<img~>"、
個々のsrc="~"のURLを抽出したいのですが、下記の条件でマッチさせることはできるでしょうか?

1. imgの属性位置・有無に問わず
2. 属性のくくりが、'" のどちらでも、または有無に問わず
3. src=~内に、"hogefuga"を含まないものにだけマッチ(否定形)


次のような正規表現で試したところ、
$pattern = '/<img.*?src=(\'|")?((?(?!hogefuga).)*\.(jpg|gif|png))(\'|")?.*?>/i';

下のようにimgタグが1行づつ並んでいる場合は上手くいったのですが、連続して並んでいる場合は個々の、"<img~>"でマッチされませんでした。

※URLは全てダミーです
<img src="http://a.com/a/a.jpg">
<img width="10" src='http://b.com/b/b.gif' height="10">
<img width="10" height="10" src='http://c.com/c/c.png">
<img src=http://d.com/d/d.jpg>
<img src="http://e.com/hogefuga/e.jpg">


最終的にはsrc="~"のURLに応じて、画像をテキストリンクへ置換する、ということをしたいのですが、正規表現がよくわからず試行錯誤しています。
このような場合はどのような正規表現を書くべきなのでしょうか?
どうぞよろしくお願いします。

投稿日時 - 2009-03-20 23:24:38

QNo.4813736

困ってます

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

3番目の明らかな文法違反があるものがある可能性があるなら
あきらめたほうがいい
そもそもHTMLとしてなりたっていない

それを除外していいならこんな感じでもいけるかも
$pattern = '/<img .*?src=[\'"]*([^ >]+?)[\'"]*[ >]/i';

投稿日時 - 2009-03-20 23:58:40

お礼

上記を参考にして、下のようなパターンに変更したところ、
個々の "<img~>"と、src="~"を抽出することができました。
[^~]の使い方など、大変参考になりました。ありがとうございますm(__)m

/<img[^src]+src=['"]*((?:(?!hogefuga).)*?(jpg|gif|png))[^>]+>/i

投稿日時 - 2009-03-24 22:06:19

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問