重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

<a href="http://example.com/aaaa/hogehoge1.jpg" target="_blank"><img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" target="_blank"> <img src="http://example.com/bbbb/hogehoge2.jpg" alt="huge2"></a>

こういうHTMLがあるとします。改行はなく1行です。

このHTMLから正規表現で 『width="100"がついていない<img>タグ』 のsrc=""までを抜き出して置換したいのです。
期待する結果は
<img src="http://example.com/hage/hogehoge2.jpg"
です。

そこで
/<img src="http:\/\/.*?.jpg"\s(?!width)/
というパターンを試しましたが、.*?の最短一致が思った通りにいかず

<img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg"
と、1つ目の<img>が入ってしまい、2つ目の<a>タグまで抜き出されてしまいます。

これをうまくwidth="\d+"と入っていない<img>タグのみに適用させる方法はないでしょうか?
どなたかよろしくおねがいいたします。

A 回答 (2件)

私自身は、秀丸を使ってなく、PHP もよくわかりませんが、次のようにしてみたらどうでしょうか。

単に、タグを跨がないようにしているだけです。

/<img src="http:\/\/.*?.jpg"\s(?!width)/

/<img src="http:\/\/[^<>]*?\.jpg"\s(?!width)/
    • good
    • 0
この回答へのお礼

完璧です!その発想はありませんでした。
ありがとうございます!

お礼日時:2014/06/02 22:27

一度imgタグを全部ひっこぬいてから、widthにマッチしないものを


拾うのが簡単では?

「width」に否定先読みするとimgタグの>が閉じていないため「.*」が
ずーっと後ろの方まで探しつづけちゃいそうです

この回答への補足

回答ありがとうございます。
申し訳ありませんが適したカテゴリが分からず正規表現に長けていそうなPHPを選んだのですが
実は秀丸エディタにての置換の話なので、一発で行ける方法が望ましいのです、、すみません。


>ずーっと後ろの方まで探しつづけちゃいそうです
そうなんです。
imgタグを閉じていないからっていうわけではないのですが、今回の場合
/<img src="http:\/\/.*?.jpg"\s(?!width)/
この .*?.jpg の部分で後ろにwidthがきていない.jpgまで続いてしまっているのが原因です。
例えこれを
/<img src="http:\/\/.*?.jpg"\s(?!width).*?>/
としたところでaタグの>までマッチしてしまうだけです。

やはり秀丸でやるならマクロを組んで一度imgタグを非難させそれを加工するしかないでしょうか…。

補足日時:2014/06/02 17:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!