以下の関数を使用して、特定のテキスト内の URL を一致させ、HTML リンクに置き換えています。正規表現はうまく機能していますが、現在は最初の一致のみを置き換えています。
すべての URL を置き換えるにはどうすればよいですか? execコマンドを使用する必要があると思いますが、その方法がわかりません。
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
ベストアンサー1
まず、URLを解析するために独自の正規表現を作成するのはひどい考えです。これは、誰かが書いてデバッグし、テスト済みそのための図書館は、RFCURIは複雑です。Node.js での URL 解析コードそしてWikipediaのページURI スキーム。
URL の解析に関しては、さまざまなエッジ ケースがあります。国際ドメイン名、実際の(.museum
)TLDと存在しない(.etc
)TLD、奇妙な句読点など括弧、URL 末尾の句読点、IPV6 ホスト名など。
私は見てきました1トンの図書館いくつかの欠点があるにもかかわらず、使用する価値のあるものがいくつかあります。
- ソープボックスのリンクファイかなりの努力が注がれており、2015年6月の大規模なリファクタリング jQueryの依存関係を削除しました。まだIDNに関する問題。
- アンカーミー新参者ですがより速いと主張するそしてよりスリムになった。IDNの問題同じように。
- オートリンカー.js非常に具体的に機能をリストします(例: 「HTML入力を適切に処理します。ユーティリティはアンカー()タグ内の属性を変更しません
href
」 )。デモが利用可能になります。
このタスクにすぐに不適格と判断したライブラリ:
- Django の urlize特定のTLDを適切に処理しなかった(こちらが公式有効なTLDのリスト。デモなし。
- オートリンクjshttp:// なしでは「www.google.com」は検出されないため、プレーンテキストで見つかった「カジュアル URL」(スキーム/プロトコルなし) の自動リンクにはあまり適していません。
- ベン・アルマンのリンクファイ2009年以降メンテナンスされていません。
正規表現にこだわるなら、最も包括的なのはコンポーネントからの URL 正規表現ただし、これを確認すると、存在しない 2 文字の TLD が誤って検出されることがあります。