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

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

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

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

正規表現

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

Dreamweaver

Dreamweaverは、アドビシステムズ(株)が開発したWebページ作成ソフトです。 HTMLやXHTMLだけでなく、PHPやASPなどのサイバーサイドスクリプトの編集も可能で、 OracleやMicrosoftSQLServerなどの、データベースとの連携機能もあります。 Webデザイナーなどの専門業界で圧倒的なシェアを誇っているソフトです。

Q&A

解決済

5回答

1416閲覧

HTML属性がダブルクォーテーションで囲まれていないものを正規表現で検索置換しダブルクォーテーションで囲むには?

hyksm

総合スコア174

HTML5

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

正規表現

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

Dreamweaver

Dreamweaverは、アドビシステムズ(株)が開発したWebページ作成ソフトです。 HTMLやXHTMLだけでなく、PHPやASPなどのサイバーサイドスクリプトの編集も可能で、 OracleやMicrosoftSQLServerなどの、データベースとの連携機能もあります。 Webデザイナーなどの専門業界で圧倒的なシェアを誇っているソフトです。

0グッド

0クリップ

投稿2017/06/27 02:03

編集2017/06/27 02:45

HTML属性がダブルクォーテーションで囲まれていないものを正規表現で検索置換しダブルクォーテーションで囲むにはそうしたらいいですか?

出来ればDwで検索置換したいです

<a href=aaa.html class=bbb></a>

<a href="aaa.html" class="bbb"></a>
としたい
一度に出来なくてもいいです
href classと順を追って置換してもOKです

正規表現で実現できそうですが方法がわからず。。。

詳しいかたご教示下さいm(_ _)m

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

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

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

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

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

mattn

2017/06/27 02:08

前提条件を書いて下さい。エディタなのか、perl なのか、vim なのか、など。
otn

2017/06/27 02:14

正規表現では、文字列の検索(マッチ)しかできません。置換するにはなんらのプログラミング言語やツールが必要です。
m.ts10806

2017/06/27 02:31 編集

3回くらい読んでようやく気づきました。Dwとさらっと書いてありますが、タグに追加した方がいいですね。質問本文でも出来れば正式名称(あとバージョンとか)で書いていただきたいところ。というより、なぜダブルクォートで囲われていないHTMLが出来上がったかというところにこの問題の本質があるのでは・・・。
mattn

2017/06/27 02:38

あー、Adobe Dreamweaver かw
hyksm

2017/06/27 02:44

すみません。Dw = Adobe Dreamweaver でした。
guest

回答5

0

ベストアンサー

この質問に対して皆さんが様子を見ている理由は、「正規表現はこれです」と一つ返事で言えないからです。
HTML の ダブルクォートされていない属性部分 にマッチさせて置換するとなると、単純に

(\s[a-zA-Z0-9-]+)=([^" >]+)

を検索し、それを $1="$2" で置換すればそれっぽく動作しますが、HTML でないテキストの中に似たパターンがあり誤爆しかねません。出来ればパターンの中に <> を含んでタグの一部としてマッチさせ誤爆を防ぎたいのです。ですがそれには「パターンには含むが置換対象としては外す」という場合に使う特殊な記法が必要になります。その特殊な記法が perl や ruby や vim によって異なります。また置換の際の後方参照文字も異なります。Visual Studio Code では $1$2 ですが、エディタや言語では \1\2 だったりします。Dreamweaver は持っていませんので確認出来ませんが、どちらかで動作すると思います。

上記のパターンで検索/置換しても、おそらく動作するかと思いますが、誤爆が無いとは断言できません。あくまで質問文にあった HTML での動作確認だけしかしていません。 必ずバックアップを取ってから お試し下さい。

なお、パターンの説明をしておきます。

() で括ったのは属性名と属性値です。あえて属性名をマッチさせ、置換文字列にも含む($1)事で誤爆を防いでいます。属性名の先頭に空白を含んでいるのも誤爆を防ぐためです。
属性値の方は

  • ダブルクォートでない
  • タグの終わりでない
  • 空白でない

でマッチしています。これにより

html

1<a href=aaa.html class=bbb></a>

href にも class にも作用する様にしています。

こんな説明でお分かり頂けますか?

投稿2017/06/27 03:16

mattn

総合スコア5030

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

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

hyksm

2017/06/27 05:33

Dwでも$1=”$2”で行けました!ありがとうございます
guest

0

クォートで括られていない属性値

クォートで括られていない属性値を置換するには

  • 開始タグの中に存在する
  • 属性値がクォートで括られていない

の2段階を踏む必要がある為、一度の正規表現の置換処理では実現できません。
正規表現では一度消費したものをもう一度、消費する事は出来ないからです。

コード(JavaScript)

この機能を実現するには HTML 文法をよく知っている必要があります。
個人的には正規表現でやるものではないように思いますがHTML Standard の仕様を軽く読んで作ったコードで良ければ、下記コードをどうぞ。

JavaScript

1'use strict'; 2var htmlString = `<a href=aaa.html class=bbb>foo</a> 3<a href="aaa.html" class="<>">foo</a> 4<a href = aaa.html class = 'bbb'>foo</a> 5<a data-attribute = "href=aaa.html" data-attribute2 = 'class=bbb'>foo</a>`; 6 7htmlString = htmlString.replace(/<\w+(?:\s+[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^=\s<>"']+))?)+/g, function (startTag) { 8 return startTag.replace(/(\s+[\w-]+\s*=\s*)(?:"[^"]*"|'[^']*'|([^=\s<>"']+))/g, function (string, name, value) { 9 return value ? name + '"' + value + '"' : string; 10 }); 11}); 12 13console.log(htmlString);

Re: hyksm さん

投稿2017/06/27 03:49

think49

総合スコア18162

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

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

0

タグの中身かどうかをチェックするのはとりあえず面倒なのでパスして
=につづくクォーテーション以外の文字を変更するならこんな感じでしょうか?

検索文字:/(?<=\w=)[^"'\s>]+/
置換文字:"$0"

投稿2017/06/27 03:00

yambejp

総合スコア114747

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

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

0

chromeとかで開いて、デベロッパーツールのElementsの内容コピーアンドペーストすれば
だいたい"で囲ったHTMLが得られると思いますよ。

追記:
DWでとなっているので、回答にはなっていないかもしれません。

投稿2017/06/27 02:57

編集2017/06/27 02:58
kanimaru

総合スコア1013

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

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

hyksm

2017/06/27 03:01

そういう手がありましたか!参考にさせて頂きます
guest

0

(Dreamweaverはわかりません)

replace(/(\s[a-zA-Z0-6]+)=([^'"][^\s>]+)/g, '$1="$2"')

これ、難しくないですか?
タグ内だけと条件付けても以下で破たんします

HTML

1<a title=" class=bbb " href="aaa.html">test</a>

投稿2017/06/27 03:10

x_x

総合スコア13749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問