操作
Backport(バックポート) #3707
未完了自動リンク機能で末尾のスラッシュを省略すると後続の日本語テキストもURLとしてリンクされてしまう
開始日:
2012-12-27
期日:
進捗率:
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]
にそれぞれ置き換える。
操作