Backport(バックポート) #3708
未完了自動リンク機能で末尾のスラッシュを省略すると後続の日本語テキストもURLとしてリンクされてしまう
50%
説明
現象¶
op_auto_link_text (source:lib/helper/opUtilHelper.php) を使用する箇所(アクティビティ、日記の本文・コメントなど)で、次のような現象が起こる。
http://example.com/テキスト
と入力して投稿すると <a href="http://example.com/">http://example.com/</a>テキスト
のように日本語の部分を除いて自動リンク機能が働くが、http://example.comテキスト
と入力して投稿すると <a href="http://example.comテキスト">http://example.comテキスト</a>
のようなリンクが生成されてしまう。
原因¶
op_auto_link_text による自動リンクで使用される正規表現は次のように定義されている。
define('SF_AUTO_LINK_RE', '~
( # leading text
<\w+.*?>| # leading HTML tag, or
[^=!:\'"/]| # leading punctuation, or
^| # beginning of line, or
\s? # leading whitespaces
)
(
(?:https?://)| # protocol spec, or
(?:www\.) # www.*
)
(
[-\w]+ # subdomain or domain
(?:\.[-\w]+)* # remaining subdomains or domain
(?::\d+)? # port
\/?
[a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]*
)
([^a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]|\s|<|$) # trailing text
~xu');
この正規表現はUTF-8モードが有効となっており(末尾の u
オプションによる)、このモードではpreg_match内部でPCREに対して PCRE_UCF オプションが使用される。このオプションでは \d
, \D
, \s
, \S
, \w
, \W
などの 重要な 文字クラスの挙動が変わり、例えば \d
は全角数字にもマッチし、 \w
は漢字や平仮名にもマッチするようになる。これによって、ドメイン部分の [-\w]+
に日本語のテキストがマッチしてしまうため前述のような現象が起こる。
参考¶
- PHP :: Bug #52971 :: PCRE-Meta-Characters not working with utf-8
- php-src/ext/pcre/php_pcre.c at master · php/php-src · GitHub
修正内容¶
SF_AUTO_LINK_RE で使用されている \w
, \s
, \d
を [0-9A-Za-z]
, \
, [0-9]
にそれぞれ置き換える。
isao sano さんが約10年前に更新
- コピー元 Bug(バグ) #3289: 自動リンク機能で末尾のスラッシュを省略すると後続の日本語テキストもURLとしてリンクされてしまう を追加
isao sano さんが約10年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
https://github.com/openpne/OpenPNE3/pull/210
にてプルリクエストしました
Shinichi Urabe さんが約10年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更