編集:議論が長くなっていたので、代わりに答えを更新することにしました。
元の正規表現が機能することを信頼して、この回答の残りの部分で簡略化されたバージョンを参照します。
/\b(https?|ftp|file)/gi
今、あなたはこれを試みました:
/^(?!src="|>)\b(https?|ftp|file)/gi
^
ここでの主なエラーは、カレットによってマークされています:カレット。これにより、正規表現は行の先頭から一致するようになります。そのため、正規表現は何も一致しませんでした。それを削除して次に進みましょう:
/(?!src="|>)\b(https?|ftp|file)/gi
今回の主なエラーは、先読みアサーションの概念にあります。コメントで説明したように、このアサーションは冗長です。「 orまたはorに一致しない限り、http
orhttps
またはftp
orに一致する」と言っているからです。それはほとんど冗長なので、その文は私たちにとって意味がありません!代わりに、必要なのは後読みアサーションです。file
src="
>
/(?<!src="|>)\b(https?|ftp|file)/gi
^
なんで?src="
文字列の後ろまたは>
後ろを見つけたいので、一致させたい可能性があります。問題?JavaScriptは後読みアサーションをサポートしていません。そこで、私は別の方法を提案しました。確かに、それは欠陥がありました(あなたが育てたように、HTMLが壊れた原因ではありませんが)。これが修正されました:
/(.[^>"]|[^=]")\b(https?|ftp|file)/gi
^^^^^^^^^^^^
これは確かに直感的ではない正規表現であり、説明が必要です。それは私たちのケースを2つに分割します。2文字のセットがあるとします。セットがまたはで終わらない場合、私たちはそれを疑っていません。行ってもいいです。続く可能性のある任意のURLに一致します。ただし、それがまたはで終わる場合、「許される」唯一のケースは、最初の文字が。ではない場合です。ご覧のとおり、ここでは少し論理的なトリックがあります。>
"
>
"
=
さて、なぜこれがあなたのHTMLを壊すかもしれないかについて。必ずJavaScriptを使用しreplace
、最初にキャプチャしたグループをページに戻します。それぞれの一致を単に無に置き換えると、2文字のセットを「食い尽くす」ことになります。これは、破壊するのではなく、調査することだけを目的としています。
html.replace(/(.[^>"]|[^=]")\b(https?|ftp|file)/gi,
function(match, $1, offset, original) {
return $1;
});