Bug(バグ) #2323
完了半角空白区切りの連続した複数のURLが正常に自動リンクされない
100%
説明
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
ファイル
Yuma Sakata さんがほぼ13年前に更新
- 3.6 で発生するか を Yes から Yes (はい) に変更
- 3.4 で発生するか を Yes (はい) にセット
Yuya Watanabe さんがほぼ13年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Yuya Watanabe にセット
Yuya Watanabe さんがほぼ13年前に更新
- ファイル スクリーンショット.png スクリーンショット.png を追加
- 説明 を更新 (差分)
www.google.co.jp や www.amazon.co.jp など,小窓となりうるリンクが存在する場合に http://www.www.google.co.jp や http://www.www.amazon.co.jp などといったようなリンクが生成されるバグが存在することを確認.
!https://redmine.openpne.jp/attachments/397/スクリーンショット.png!
Yuya Watanabe さんがほぼ13年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 a242107d3d94c5b454036de6ac7be7fa23c47b93 で適用されました。
Kousuke Ebihara さんがほぼ13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Shouta Kashiwagi さんが12年以上前に更新
- ファイル 20120306134755.png 20120306134755.png を追加
- ステータス を Pending Testing(テスト待ち) から Rejected(差し戻し) に変更
- 進捗率 を 70 から 50 に変更
テスト実施しましたが、修正が必要な点がありましたので確認お願いします。
以下のように、全角空白文字でURL区切りを行った場合にURLリンクが添付画像のように不完全となってしまいます。
(添付画像、「 http://example.com/detail.php?id=1 」の部分です)
携帯版でも同様の現象が再現できました。
修正の程、よろしくお願い致します。
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 でも同じ修正を施しているため,これらのバージョンでも再現するものと思うため,それぞれ確認のうえでバグチケットの報告および修正が必要と思います.
参考¶
Yuya Watanabe さんが12年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 c400cefb14d56e07e3e9aa73d25343a601749daa で適用されました。
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Accepted(着手) に変更
- 進捗率 を 50 から 0 に変更
note-8 の修正はまだ取り込んでいないためステータスを「Accepted」に戻します.
Yuya Watanabe さんが12年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 3ddfaa35a811a2b7794a144c98a58146c2bf738a で適用されました。
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。