URLの自動リンク

URLの自動リンク

[8] 色々なソフトウェア平文利用者の入力文、 あるいは HTMLメール地の文などから、 URL らしき部分を自動的に検出し、これをリンクとして表示する自動リンク機能が備わっています。

[9] 中には URL の、あるいは HTTP(S) URL など一部の URL の構文を機械的に正規表現に変換しただけのような雑な実装もありますが、 実用上十分良好な利用者体験を提供するためには、 細かな調整が必要となります。

[12] 実装の中には、 HTML文字参照への変換と URL自動リンクの処理順序が不適切であるなど、 他の処理との兼ね合いで異常な動作をしたり、セキュリティー上の問題をはらんでいたりするものもあります。

[57] URL の他に、メールアドレス電話番号アプリケーション依存の構造 (ハッシュタグなど) でも同様の仕組みが使われることがよくあります。

[58] 本項では特に断らない限り URL自動リンクを扱いますが、 それ以外の自動リンクにも触れます。

実装戦略

[78] URL の構文を正規表現のようなものに置き換えて一致させてリンクを作ればいいだけではないのだろうか、 と安易に考えがちですが、それだけでは実用的なものになりません。 簡単そうに見えて、これは思っている以上に複雑な問題なのです。

[79] 明文化された手順や有名な実装だけでもいくつもありますが、 それぞれ違った方針で違った特徴を持ったものになっています。 それぞれに欠点もあります。

境界の処理

[2] 「This is great: https://example.com/great.html. Thanks!」 の最後の「.」は URL の一部ではなく英文の一部と解釈する必要があります。

[3] とすると「See www.example.com.」も www.example.com. を表すのではなさそうです。

[4] 「See https://example.com/great.html, please.」 の「,」は URL の一部ではなく英文の一部と解釈する必要があります。

[48] これを正しく扱えないメーリングリストアーカイブ生成ソフトウェアがあります。

[5] 「https://example.com/pageU+3000です」は、 U+3000 の前までを URL と解釈する必要があります。

[6] GitHub はこれを正しく扱えません。

[7] 「... (https://test.test/foo)、...」 で GitHub) のあともずっと URL の一部とみなします。

[13] はてなブックマークブックマークコメントでは、 URL の後に「>」 があると、「>」まで URL の一部とみなします。

[14] 掲示板の自動リンクで、 #! のような !URL の一部と見なされず、その直前までが URL とみなされることがあります。

[15] W3Cメーリングリストのアーカイブ: Re: Breaking the `opener` relationship. (Mike West著, ) https://lists.w3.org/Archives/Public/public-webappsec/2017Apr/0078.html は、なぜか

`WindowProxy`'s `GetOwnProperty` uses https://html.spec.whatwg.org/#isplatformobjectsameorigin-(-o-): I'd just stick with that as a determinant of the properties listed in https://html.spec.whatwg.org/#crossoriginproperties-(-o-).

`WindowProxy`'s `GetOwnProperty` uses https://html.spec.whatwg.org/#isplatformobjectsameorigin-(-o-): I'd just stick with that as a determinant of the properties listed in https://html.spec.whatwg.org/#crossoriginproperties-(-o-).

と解釈します。

[19] みのさんのツイート: "https://t.co/927QpBK32e!" () https://twitter.com/mino90h/status/873210646183026689

[20] ! で終わる URLTwitter! の直前まで URL と認識。

[21] GitHubhref="https://example.com/">Example Web Page</a> の「https:」から「Example」 までを1つの URL とみなします。

[1] Latest topics > Text LinkとLinkification - outsider reflex (YUKI "Piro" Hiroshi 著, 版) http://piro.sakura.ne.jp/latest/blosxom/mozilla/extension/2006-03-10_textlink.htm

「http://www.<em>mozilla</em>.org/」みたいに複数のテキストノードに分割されたURIも認識できる。

某新聞社のサイトのように「http://piro.sakura.ne.jp/」ってな全角文字で書かれたURIも認識できる。

2chでよくある「ttp://」で始まるURIも認識できる。ていうか最初はこれが目的だったんだよね……

[42] LimeChat《http://example.jp/abc-def/》 の最後の括弧まで URL と認識してしまいます。

[51] [tz] Some time zone history (2), , https://mm.icann.org/pipermail/tz/2020-November/029514.html

https://parliament.gov.gy/documents/acts/10923-act_no._27_of_1975_-_interpretation_and_general_clauses_(amendment)_act_1975.pdf

「)」の直前の「t」までで URL が終わると誤認してしまっています。

[53] [JavaScript] PCのタイムゾーン・時差情報の活用: Kawanet Blog II, https://kawa.at.webry.info/200610/article_1.html

        location.href = 'http://www.kawa.net/xp/index-j.html';リンク

ブログソフトウェアの自動リンクによるものか。

[89] PyCon JPの技術に対する不正の告発、並びに技術者と大衆に対しての警鐘 #Python - Qiita, https://qiita.com/python_bokume2/items/7aa80b73010919007581

[90] >>89 URL 直後の全角閉じ括弧を誤解している事案。こういうの平成の頃はたまに見たけど最近見ないよね。 こういう壊れた実装って未だにあるんだー

[93] it-talks(いっとく)/@DSi, https://pulpdust.org/i/?topic=%40DSi&sort=ASC

[94] >>93

http://ugomemo.hatena.ne.jp/1351D79031C5FE68@DSi/movie/C5FE68_0A6EF461FE09B_002

のような URL@ の前までが URL と誤認している。

非ASCII文字

[27] かつては URL には非ASCII文字は認められていなかったので、 日本語などの非ASCII文字主体の文章では URL とその周りの区切りは比較的明確でした。

[28] ところが URL非ASCII文字一般が認められるようになってから、 URL の直後に文章が続いているものと URL非ASCII文字が含まれるものの区別が難しくなりました。

[31] 素片識別子非ASCII文字を含む語が書かれている場合や、 パス見出し語が入る WikipediaURL の場合のように、 非ASCII文字が含まれる URL が書かれることは少なくないため、 何らかの対応は必須といえます。

リンク回避

[22] 自動リンク機能のある掲示板などの利用者は、 自動リンクを敢えて回避することを好む場合があります。

[23] そのため http:h を省略した ttp: のような URL が用いられることもあります。

ttp: 参照。

[24] しかしそうした自動リンクを回避した URL を敢えて自動リンクリンクをたどる利用者の便を図る実装もあります。

[43] 2ch では自動リンク回避のため ttp: URL の文化が発達しました。 専用ブラウザーはこれを http: URL と解釈して自動リンクしていました。

URL scheme の省略

[32] ドメイン名のみを書いたり、 ドメイン名から始まる不完全な URL を書いたりして省略して HTTP(S) URL を表すこともあります。 自動リンクの実装の中には、そうした不完全なものも抽出しようと試みるものがあります。

ドメイン名のみの自動リンク

[59] ドメイン名のみで構成される文字列が自動リンクされることがあります。

[60] そのような実装の多くは http:// を補います。

[61] 実はそれほど役に立つ場面は多くなく、最近はあまり実装されていない印象があります。

[62] ドメイン名HTTP(S) URL 以外にも色々な用途がありますが、 HTTP 以外の URL と解釈するものは見たことがありません。 HTTP の場合以上に自動リンク化したい需要がないということなのでしょう。

[63] IDN 対応すると、句読点を含んだほとんどどんな文字列もドメイン名扱いしてしまうことになります。 既知の TLD で終わるかどうかで制限すれば幾分ましになりますが、 近年 TLD はどんどん追加されていますから、追随すればするほど悪化します。 しかし IDN もそれほど使わていないのが現状で、 わざわざ対応して使い勝手を落とす必要性は疑問です。

URL 以外の自動リンク

[39] メールアドレス電話番号自動リンクされることがしばしばあります。

[66] メールアドレス平成時代中頃まではよく自動リンクの対象になっていました。 その後は (私的、娯楽的領域における) インターネットメールの衰退のためか、 対象とされなくなってきている印象があります。 ただし MUA では依然として対象になっています。

[67] 電話番号スマートフォンの普及 (= 自動リンクされた媒体を閲覧する端末と電話機の統合) により自動リンクの対象に含まれがちになってきている印象があります。 ただし自動リンクされるような媒体電話番号自動リンクを使って利用者電話したり、アドレス帳に登録したり、 といった需要があるのかは、疑問もあります。

[65] Webブラウザー自動リンク機能を実装し、 a 要素がなくてもリンク表示することがあります。 x-ms-format-detection も参照。

[68] メールアドレスmailto:, 電話番号tel: が暗示されているとみなすことで、URL自動リンクの特殊形として扱うことができます。


[64] その他にアプリケーション依存の識別子などの自動抽出・リンク化が実装されていることがあります。

[69] Wiki は元々 WikiName と呼ばれる独特の名前文字列構文に一致するものをリンク先ページ名とみなして自動リンクするシステムでした。

[70] Wiki の中には、伝統的な WikiName 構文でなくとも、 データベース中のページ名に一致する任意の文字列を検出し自動リンクするものもありました。 商用サービスでははてなダイアリーの実装例が有名で、 はてなキーワードの登録キーワードに一致すると (特別な構文を使わなくても) 自動的に当該キーワードへのリンクとなりました。

[71] 近年では多くのWebサービスSNSハッシュタグを実装しています。 ハッシュタグ# から始まる文字列を分類キーワードとみなすもので、 文中にその形式の文字列があれば自動リンクされます。

[73] ハッシュタグ中に使える文字は、採用サービスによって少しずつ違います。 統一的な規定はありません。 識別子文字

[74] 昔の TwitterASCII文字しか使えませんでした。 日本のものでも昔から使われ続けているハッシュタグASCII英数字だけだったりします。

[75] しかし多くの人に普及したサービスではやはりASCII文字のみという制限は非現実的であり (文化的多様性を否定する差別的取り扱いでもあり)、 現在では多くのサービスが非ASCII文字を認めています。

[76] ところが記号類の扱いはサービスによって違っています。 サービスによっては通常表記に必要な文字まで記号とみなすためか、 ハッシュタグで使えないことがあります。

[77] たとえば YouTube仮名長音記号異体字として使われる ( 長音記号 ) をハッシュタグに認めていません。 普通に使えると誤解して使ってみたら使えなかったという日本人利用者が困っている現実があります。

[40] smart tag も参照。

[85] LINE では金額リンク化されます。 >>84, >>86 日本語日本円タイ語タイバーツリンク化されると説明があり、 他の言語には説明がありません。 言語ごとに挙動が変わるのか、説明が違うだけで挙動は共通なのか、 実はなど他の設定によって挙動が変わるのか、不明です。

[84] ヘルプセンター, LINE, https://help.line.me/line/android/categoryId/20008811/3/pc?lang=ja&contentId=20023821

金額テキストのリンク表示やリンクを使用した送金(送付)は、以下の条件を全て満たす場合のみ可能です。

- 1:1またはグループトークルームで送信されたメッセージ

- 送信されたメッセージに数値と通貨単位(¥、円、yen)が一緒に表記されている

※数値と通話単位の間には空欄(半角スペース)1つまで入力できます

- 金額が1円~100,000円の範囲内

-(リンクを利用して送金する場合)LINE Payに加入済み

- LINEの最新バージョンを利用している

[86] ศูนย์ช่วยเหลือ, LINE, https://help.line.me/line/smartphone/pc?lang=th&contentId=20023821

สามารถส่งเงินผ่านลิงก์ดังกล่าวได้ต่อเมื่อครบตามเงื่อนไขต่อไปนี้ทั้งหมดเท่านั้น

- อยู่ในห้องแชทแบบตัวต่อตัว

- คุณและเพื่อนในห้องแชทสมัครใช้บริการ Rabbit LINE Pay และ LINE BK เรียบร้อยแล้ว

- รับส่งข้อความที่มีตัวเลขและสกุลเงินระบุร่วมกัน โดยมีช่องว่างระหว่างตัวเลขกับสกุลเงินไม่เกิน 1 ช่อง

* ตัวเลขต้องเป็นจำนวนเต็ม หรือจำนวนทศนิยมไม่เกิน 2 ตำแหน่ง

* คำระบุสกุลเงินที่ใช้ได้ ได้แก่ THB, Baht, บาท, ฿ โดยตัวอักษรภาษาอังกฤษเป็นพิมพ์เล็กหรือพิมพ์ใหญ่สลับกันได้

* ตัวอย่าง : 1,000 THB, 100Baht, 10.50บาท, ฿20

- ใช้งานแอปพลิเคชัน LINE เวอร์ชันล่าสุด (อัปเดต ที่นี่)

対応する URL scheme

[10] 任意の URL を自動リンク化すると、 : さえ入っていればほとんどどんな文章でも一部が URL ということになってしまいます。

[35] 一般的な実装は特定の URL scheme のみに対応しています。 HTTP(S) URL のみに対応する最低限のものから、 それ以外の色々な URL に対応するものまであります。

[36] よく対応されている URL scheme

[11] javascript: など、危険な動作を誘引する URL scheme もあります。無邪気な実装はセキュリティーホールとなりかねません。

区切り文字

[25] 古い URLRFC では、自然言語文に URL を混ぜる場合は区切りとして <> で括るのが好ましいという記述がありました。 URL そのため URL の前後に <> を書くことをよしとする人もいます。 しかしこの慣習は一般には普及しませんでしたし、 Web 技術に詳しい人の中でもそこまで有名ではありません。 (が無視するのは惜しいほどには普及しています。)

[26] <> は通常の URL には含まれないものですから、 自動リンクの実装は特に考慮しなくてもこの区切り文字を意図通りに解釈すると期待されます。 しかし文字参照の扱いが杜撰な自動リンクの実装に誤解釈されることもあるようです (例えば >>13)。

[18] RFC 7322 - rfc Style Guide () https://tools.ietf.org/html/rfc7322#section-3.3

Angle brackets are strongly recommended around URIs [STD66], e.g., http://example.com/

[88] 関連: URLの表示

自動リンク機能付きマーク付け言語

[33] Wiki構文などテキスト系のマーク付け言語は、 自動リンク機能を言語の一部として組み込んでいることがよくあります。

[34] はてな記法URL自動リンクの他に、 はてなキーワードのキーワード自動リンクなどもあります。

[83] Markdown の実装の多くはURL自動リンクも行います。

[17] GitHub Flavored Markdown Spec () https://github.github.com/gfm/#autolinks-extension-

[80] マーク付け言語系の自動リンクには、それ独特の難しさがあります。 マーク付け言語の構文を構成する記号類は URL とみなしてはいけません。 しかし URL の中にそのような記号が含まれることもあります。 マーク付け言語エスケープ構文を使わせるのが筋ですが、 書きやすさを犠牲にしてしまいます。

[81] 問題を避けるには、マーク付け言語を慎重に設計する、なんなればマーク付け言語の設計に自動リンクを組み込む必要があります。 そうなるとマーク付け言語の構造の検知と URL の検出は同時に行う必要があります。 構文解析が済んでから自動リンクへという処理の分離ができなくなります。

[82] 例えば pre 要素相当の構造の中では自動リンク機能を停止したい、 のように自動リンクの制御とマーク付け言語の機能の連動の要件も出てくると、 実装方針はますます制約されることになります。

文脈

[37] 次のような分野で使われています。

[38] 自動リンクする場面

テストデータ

[47] 自動リンクテストデータ。 HTCT 形式のテストセット中に、 入力例とそのURL自動リンク検出例、 HTML 変換例が記述されています。

その他実装例

[45] Perl による実装。

関連

[49] リンク展開

歴史

[95] Proposed Draft UTS #58: Unicode Linkification, https://www.unicode.org/L2/L2024/24217-uts58-working-draft.html

メモ

[91] interactive hypermedia, , https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0124.html

[92] >>91 最後の段落、やや明確ではないけど、 URL自動リンクするということかな。 自動リンク仕様の最古の言及かも。自動リンクしていたサーバー用ソフトウェアはこれ以前からあったのかもしれないけど。

[16] OPMLファイルやHTML、テキストファイルからの一括登録機能の追加 - はてなアンテナ日記 - 機能変更、お知らせなど () https://hatena.g.hatena.ne.jp/hatenaantenna/20060905/1157428635

はてなアンテナで、複数のページを一括で登録する機能を追加しました。OPMLファイルやHTML、またテキストファイルに対応しています。(テキストファイルからはURLと判別できる文字列を抽出します。)

[50] Tcl Improvement Proposals: TIP 3: TIP Format, https://core.tcl-lang.org/tips/doc/trunk/tip/3.md

[52] RFC 1842 - ASCII Printable Characters-Based Chinese Character Encoding for Internet Messages, , https://tools.ietf.org/html/rfc1842#section-10

原文

   at Beijing, China:             ftp://info.bta.net.cn:/pub/software/;
   at Shanghai, China:            ftp://info.bta.net.cn:/pub/software/;
   at Taiwan:                 ftp://nctuccca.edu.tw/pub/Chinese/ifcss/;
             or              ftp://ftp.edu.tw:/Chinese/ifcss/software/;
   At Singapore:                    ftp://ftp.technet.sg:/pub/chinese/;
   at California, U.S.A.:                  ftp://cnd.org/pub/software/.

これが自動リンクされた結果の解釈:

   at Beijing, China:             ftp://info.bta.net.cn:/pub/software/;
   at Shanghai, China:            ftp://info.bta.net.cn:/pub/software/;
   at Taiwan:                 ftp://nctuccca.edu.tw/pub/Chinese/ifcss/;
             or              ftp://ftp.edu.tw:/Chinese/ifcss/software/;
   At Singapore:                    ftp://ftp.technet.sg:/pub/chinese/;
   at California, U.S.A.:                  ftp://cnd.org/pub/software/.

なぜこんな切り方になるのか理解し難い。規則性が見えそうで見えない。

[54] Linkification of URLs - 24122-url-linkification.pdf, , https://www.unicode.org/L2/L2024/24122-url-linkification.pdf

[55] UASG 010 Quick Guide to Linkification EN - Universal Acceptance Steering Group (UASG), , https://uasg.tech/download/uasg-010-quick-guide-to-linkification-en/

[56] >>55 例文自体の自動リンク化が推奨と無関係の滅茶苦茶な状態のままで草。てきとーに編集してるんかいw

[87] 電子メール本文中の日本語ドメイン名URLをクリックできるようにするには - 日本語.jp ( 版) http://nihongojp.jp/support/mail_guide/ (名無しさん )

[96] SMSおよび+メッセージの本文に電話番号を指定するとリンクが付与され、タップすることで発信できますか? – KDDI Message Cast サポートWEB () https://help-kmcsupport.com/faq/a0310014/

電話番号の前後にスペースを付与し本文指定(例:△0120-xxx-xxx△)することで実現可能です。ただし、端末機種およびアプリバージョンに依存する仕様となるため、

[97] JVN#43561812: スマートフォンアプリ「+メッセージ(プラスメッセージ)」における Unicode 制御文字の扱いに関する脆弱性 (, ) https://jvn.jp/jp/JVN43561812/

[98] JVN#43561812: スマートフォンアプリ「+メッセージ(プラスメッセージ)」における Unicode 制御文字の扱いに関する脆弱性 (, ) https://jvn.jp/jp/JVN43561812/

[99] +メッセージの挙動はクライアントによると推測されますが、 ある携帯電話のクライアントの場合は、 foo.test/abcfoo.test のような URL scheme がないものも URL として自動リンクします。

[100] 非ASCII文字も認識されることがあるらしく、 foo.test… だとまでドメイン名の一部とみなします。