質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

3回答

2285閲覧

HTML5の(未)終了タグを終了タグに一括変換したい

MomoKallas

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/08/07 21:44

###前提・実現したいこと

使用エディタ:Ecilpse

Eclipse 上で、HTMLの編集をしています。
やりたいこと

以下のような、閉じられていないタグを正規表現を使って一括で変換したい。
対象となるタグは、指定しても構わない。

HTML

1ex1) 2<img class="media-object" src="assets/img/user3.png" alt="Antoio"> 34<img class="media-object" src="assets/img/user3.png" alt="Antoio"/> 5 6ex1) 7<br> → <br />

###発生している問題・エラーメッセージ
先読み否定の文法を使って、この問題に対処しようとしているのですが、うまく行きません。
(<img)(?!.*<)(?!.*/)>)

と書いた場合、以下の行も対象に含まれてしまいます。
行数が多いので、一度処理された行は置換対象から外したいのですが、そこがうまくできません。

HTML

1<img class="media-object" src="assets/img/user3.png" alt="Antoio" />

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

素直に文字クラスで否定して、(<img[^>]+[^>/])>というような形にしてはどうでしょうか(なお、<br>のようなものは別処理が必要となります)。

なお、HTML5ではXHTMLとは違い、空要素を閉じるときにスラッシュは入れない形が本来の姿で、XHTMLとの互換上「入れることもできる」とのことです(FAQ)。

投稿2016/08/08 00:06

編集2016/08/08 00:11
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

intelf___

2016/08/08 00:29

正規表現:(<img[^>]+[^>/])> 解釈:①<imgとマッチして、②>の手前までマッチして、③/か>の一文字とマッチせず、④>とマッチする ②で>の手前までマッチしたら必ず次は>なので、③で>とマッチしないということはありえません。 つまり、何にもマッチしない正規表現になってないでしょうか。
maisumakun

2016/08/08 00:31

いえ、[^>]+の部分で「閉じタグの1文字手前まで」にマッチして、残り1文字が(スラッシュでなければ)[^>/]にマッチします。
intelf___

2016/08/08 01:04

<img /> の閉じタグの一文字手前までマッチ[^>]+ [<img /]> OK 残り1文字が(スラッシュでなければ)[^>/] [<img /][>] NG <img src="a"> の閉じタグの一文字手前までマッチ[^>]+ [<img src="a"]> OK 残り1文字が(スラッシュでなければ)[^>/] [<img src="a"][>] NG こうなるような気がするのですが もちろん正規表現の環境によって多少動作に差があることは理解しています。
maisumakun

2016/08/08 01:11

正規表現は通常、「全体がマッチすることを優先」しますので、<img src="a">は、<img[ src="a]["]>のようにヒットしてくれます。 逆に、「+で必要以上の長さを取り込んでしまっても構わない」という使い方をあえてしたい場合には、「強欲な指定子」といって明示的に指定する必要があります。
intelf___

2016/08/08 02:16

わざわざありがとうございます。 <img[ src="a"][>] [>]NG(全体マッチ優先) <img[ src="a]["]> ["]OK <img[ src="a]["][>] [>]OK <img[ src="a" ][/]> [/]NG(全体マッチ優先) <img[ src="a"][ ]/> [ ]OK <img[ src="a"][ ][/]> [/]NG ということですね、勉強になります。 [^>]+[^>/]の部分が一文字ずつ必要とするので、<img__>と横に二文字(+を*にしても一文字)ないとマッチしないというのが弱点でしょうか。
maisumakun

2016/08/08 02:42

[^>]*にすれば1文字で対応できますが、それでも<br>のようなパターンは無理ですね。
MomoKallas

2016/08/08 05:33

お返事する前に話が進んでしまって恐縮です。動作確認できました。ありがとうございます。
guest

0

/(<(img|br)[^>]*)>/ を "\\1/>" に置換。 続けて /\/\/>/ を "/>" に置換(もともと /> だったものの対応)。

ですかね。

投稿2016/08/08 05:03

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

<img.(?<!/)>
こんな感じでどうですか?すべてのタグの後に改行されていることが必須になります。
一度に指定するなら
<(img|br).
(?<!/)>
のようになります。

\1で元の文字列を取得する必要がありそうなので、()でくくって

置換前
(<(br|img).*(?<!/))>
置換後
\1 />

といった感じ。
こちらの環境ではひとまず動作しました。
もし表記に差があるなら、\s*でタブやスペースを許容したりしましょう。

投稿2016/08/08 00:19

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問