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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

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

Q&A

解決済

1回答

1737閲覧

正規表現 否定を利用してhttpやhttps以外からはじまるsrcやhref属性を置換したい

SugiuraY

総合スコア318

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

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

0グッド

0クリップ

投稿2021/04/20 07:52

正規表現の理解が浅く申し訳ないのですが、srcやhref属性の値としてjavascript:などが埋め込まれないようにhttpやhttpsからはじまる値を、例えば"#"置換したいと考えております。

jacasvript

1var sample1 = <a href="http://example...."></a> //変換されない 2var sample1 = <a href="https://example...."></a> //変換されない 3var sample1 = <a href=" https://example...."></a> //href="#"に変換される 4var sample1 = <a href="javascript:...."></a> // href="#"に変換される

そこで、正規表現で否定形を調べている中で否定先読があることをしりました。(?!)でくくるということでがわかりました。
これを前提に以下のように処理を記載した所、適切に動作させることができませんでした。

jacasvript

1var str = '<a href="javascript:***" target="_blank">リンク先</a>'; 2str.replace(/href="(?!(http|https))"/, "#") 3console.log(str) 4//"&lt;a href=\&quot;javascript:***\&quot; target=\&quot;_blank\&quot;&gt;リンク先&lt;/a&gt;" 5//期待する結果↓ 6//"&lt;a href=\&quot;#\&quot; target=\&quot;_blank\&quot;&gt;

正規表現上の否定の書き方,グループ化の書き方パイプの書き方など、まだ不安な点が多く申し訳ございませんが、問題点についてご指摘いただければ幸いです。

【追記】
正規表現の論点なので、Javascriptで記載しておりますが、実際にはサーバーサイドにおいても同様に検査をする予定ですので、その点はご放念願います。

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

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

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

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

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

yambejp

2021/04/20 08:22

サイト内リンク:src="/hoge.html" ページ内リンク:src="#hogehoge" パラメータリンク:src="?hoge=123" はどうするのですか?
SugiuraY

2021/04/20 08:44

ありがとうございます。 上記の例は全て拒否されます。
yambejp

2021/04/20 08:45

src="http.html"とかされたらどうするのでしょうか? 「http(s)://」まで調整するのでしょうか?
SugiuraY

2021/04/20 08:54

本件は申し訳ございません。http.htmlから始まるもので意図しない不正な埋め込みがあり得るという認識がございませんでした。しかしながら、URLに縛りたいのであれば、http(s)://まで含める事が妥当に思えます。
SugiuraY

2021/04/20 09:01

URLにはアスキー形式以外にも様々存在するとは調べたのですが、http(s)://以外は受け付けないで良いと思っています。ただ、maisumakun様から指摘頂いた、引用符は完全に想定外であったため、単純に正規表現での対応を再考しております。
guest

回答1

0

ベストアンサー

正規表現の理解が浅く申し訳ないのですが、srcやhref属性の値としてjavascript:などが埋め込まれないようにhttpやhttpsからはじまる値を、例えば"#"置換したいと考えております。

正規表現では煩雑かつ見落としが生じる(たとえば、<a href=javascript:alert()>foo</a>と引用符のない形もHTMLとして正当です)恐れがありますので、DOMとして処理することをおすすめします。

投稿2021/04/20 07:59

maisumakun

総合スコア146018

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

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

maisumakun

2021/04/20 08:05

<a class="hoge" href = 'javascript:'>のように、<aの直後にhrefが来るとは限りませんが、この「<aの中にあるhref」に正しくマッチさせるだけでも、膨大な量の正規表現が必要となります。
SugiuraY

2021/04/20 08:07

maisumakunさん ありがとうございます。引用符なしても実行されてしまうことをしりませんでした。大変勉強になりました、ありがとうございます。 ところで、DOMで処理する場合でも最終的にattributeの中身をチェックする際に正規表現を使用せざる得ないと考えたのですが、誤解がありますでしょうか?
maisumakun

2021/04/20 08:15

> ところで、DOMで処理する場合でも最終的にattributeの中身をチェックする際に正規表現を使用せざる得ないと考えたのですが、誤解がありますでしょうか? 必ずしもそうとは限りません。たとえば、「最初4文字がhttpか」のチェックで片付けるなら、正規表現なしで済ませることも可能です。
maisumakun

2021/04/20 08:16

(本題ではないかもしれませんが、「href="/"」のような相対参照も消すべきものなのでしょうか?)
SugiuraY

2021/04/20 08:40

有難うございます。 はい、相対参照も意図に含まれないものとして、拒否される予定です。
SugiuraY

2021/04/20 12:53

一旦DOMで処理することを検討してみようと思うのでCloseさせていただきます。 コメントを頂きましたことを御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問