プロジェクト

全般

プロフィール

Bug(バグ) #2323

半角空白区切りの連続した複数のURLが正常に自動リンクされない

Shingo Yamada12年以上前に追加. 8年以上前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2011-07-29
期日:
進捗率:

100%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

半角空白区切りの連続した複数のURLが正常に自動リンクされない

詳細

日記本文で現象を確認

書き込み内容
http://example.com/ http://example.com/hoge http://example.com/fuga http://example.com/hoge
ブラウザ出力結果(HTML)
<div class="title">
<p class="heading">test</p>
</div>
<div class="body">
<a href="http://example.com/" target="_blank">http://example.com/</a> http://example.com/hoge <a href="http://example.com/fuga" target="_blank">http://example.com/fuga</a> http://example.com/hoge</div>
</dd>
</dl>

Causes (原因)

リンクを生成する際に URL を正規表現でマッチさせているが,これがプレフィックスとして空白文字を考慮していない.

lib/helper/opUtilHelper.php 313-317行目

 310 if (!defined('SF_AUTO_LINK_RE'))
 311 {
 312   define('SF_AUTO_LINK_RE', '~
 313     (                       # leading text
 314       <\w+.*?>|             #   leading HTML tag, or
 315       [^=!:\'"/]|           #   leading punctuation, or
 316       ^                     #   beginning of line, or
 317     )                             
 318     (                             
 319       (?:https?://)|        # protocol spec, or
 320       (?:www\.)             # www.*
 321     )                             
 322     (                     
 323       [-\w]+                   # subdomain or domain
 324       (?:\.[-\w]+)*            # remaining subdomains or domain
 325       (?::\d+)?                # port
 326       \/?                 
 327       [a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]*
 328     )                     
 329     ([[:punct:]]|\s|<|$)    # trailing text
 330    ~x');                  
 331 }                         

Way to fix (修正内容)

正規表現で URL にマッチさせる際に空白文字を考慮する.

diff --git a/lib/helper/opUtilHelper.php b/lib/helper/opUtilHelper.php
index 59d22bc..d918493 100644
--- a/lib/helper/opUtilHelper.php
+++ b/lib/helper/opUtilHelper.php
@@ -313,7 +313,8 @@ if (!defined('SF_AUTO_LINK_RE'))
     (                       # leading text
       <\w+.*?>|             #   leading HTML tag, or
       [^=!:\'"/]|           #   leading punctuation, or
-      ^                     #   beginning of line
+      ^|                    #   beginning of line, or
+      \s?                   #   leading whitespaces
     )
     (
       (?:https?://)|        # protocol spec, or

スクリーンショット(2011-07-29_18.16.26).png 表示 (23.3 KB) Shingo Yamada, 2011-07-29 18:23

スクリーンショット.png 表示 (35.5 KB) Yuya Watanabe, 2012-01-17 01:22

20120306134755.png 表示 (17.6 KB) Shouta Kashiwagi, 2012-03-06 13:48


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #2733: 半角空白区切りの連続した複数のURLが正常に自動リンクされない Fixed(完了) 2011-07-29
関連している OpenPNE 3 - Backport(バックポート) #2734: 半角空白区切りの連続した複数のURLが正常に自動リンクされない Fixed(完了) 2011-07-29

関係しているリビジョン

リビジョン a242107d (差分)
Yuya Watanabe12年以上前に追加

(fixes #2323) fixed to put links automatically when the text has whitespaces

リビジョン c400cefb (差分)
Yuya Watanabe約12年前に追加

(fixes #2323) fixed to put links automatically when the text has whitespaces

リビジョン 3ddfaa35 (差分)
Yuya Watanabe約12年前に追加

(fixes #2323) fixed to link correct url

リビジョン 0ce086c4 (差分)
Yuya Watanabe約12年前に追加

(refs #2323) fixed for cording standard

リビジョン 7697b6fd (差分)
Yuya Watanabe約12年前に追加

(fixes #2323) fixed to link correct url

リビジョン 454f44d9 (差分)
Yuya Watanabe約12年前に追加

(refs #2323) fixed for cording standard

履歴

#1 Yuma Sakata12年以上前に更新

  • 3.6 で発生するかYes から Yes (はい) に変更
  • 3.4 で発生するかYes (はい) にセット

再現確認

以下バージョンで再現確認できました。

  • 3.6.1
  • 3.4.18

#2 Yuya Watanabe12年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Yuya Watanabe にセット

#3 Yuya Watanabe12年以上前に更新

www.google.co.jpwww.amazon.co.jp など,小窓となりうるリンクが存在する場合に http://www.www.google.co.jphttp://www.www.amazon.co.jp などといったようなリンクが生成されるバグが存在することを確認.

!https://redmine.openpne.jp/attachments/397/スクリーンショット.png!

#4 Yuya Watanabe12年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 a242107d3d94c5b454036de6ac7be7fa23c47b93 で適用されました。

#5 Kousuke Ebihara約12年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#6 Shouta Kashiwagi約12年前に更新

  • ファイル 20120306134755.png 表示 を追加
  • ステータスPending Testing(テスト待ち) から Rejected(差し戻し) に変更
  • 進捗率70 から 50 に変更

テスト実施しましたが、修正が必要な点がありましたので確認お願いします。

以下のように、全角空白文字でURL区切りを行った場合にURLリンクが添付画像のように不完全となってしまいます。
(添付画像、「 http://example.com/detail.php?id=1 」の部分です)

携帯版でも同様の現象が再現できました。
修正の程、よろしくお願い致します。

#7 Shouta Kashiwagi約12年前に更新

  • 対象バージョンOpenPNE 3.7.0 から 252 に変更

#8 Yuya Watanabe約12年前に更新

  • ステータスRejected(差し戻し) から Accepted(着手) に変更
  • 進捗率50 から 0 に変更

原因

URLの終了部分が正しく考慮されていなかったため trailing text にマッチする部分として '=' や '.' があったために note-6 のような挙動になったと言えます.

修正案

trailing text を記号([:punct:])だけでなく,URLに用いられる文字以外すべてとすることで問題を解決できると思います.

diff --git a/lib/helper/opUtilHelper.php b/lib/helper/opUtilHelper.php
index 5a17e99..4e2694c 100644
--- a/lib/helper/opUtilHelper.php
+++ b/lib/helper/opUtilHelper.php
@@ -327,8 +327,8 @@ if (!defined('SF_AUTO_LINK_RE'))
       \/?
       [a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]*
     )
-    ([[:punct:]]|\s|<|$)    # trailing text
-   ~x');
+    ([^a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]|\s|<|$)    # trailing text
+   ~xu');
 }

 function op_url_cmd($text)

その他

3.6.x および 3.4.x でも同じ修正を施しているため,これらのバージョンでも再現するものと思うため,それぞれ確認のうえでバグチケットの報告および修正が必要と思います.

参考

https://tools.ietf.org/html/rfc3986#section-3.3

#9 Yuma Sakata約12年前に更新

  • 対象バージョン252 から OpenPNE 3.8beta1 に変更

#10 Yuya Watanabe約12年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 c400cefb14d56e07e3e9aa73d25343a601749daa で適用されました。

#11 Yuya Watanabe約12年前に更新

  • ステータスPending Review(レビュー待ち) から Accepted(着手) に変更
  • 進捗率50 から 0 に変更

note-8 の修正はまだ取り込んでいないためステータスを「Accepted」に戻します.

#12 Yuya Watanabe約12年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 3ddfaa35a811a2b7794a144c98a58146c2bf738a で適用されました。

#13 Yuya Watanabe約12年前に更新

更新履歴 7697b6fdd9ca2c668192b5fd10475284906c2c4b で適用されました。

#14 Yuya Watanabe約12年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#15 Yuma Sakata約12年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

#16 kaoru n8年以上前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF