Bug(バグ) #3289
Youichi Kimura さんがほぼ12年前に更新
h3. 現象
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>@ のようなリンクが生成されてしまう。
h3. 原因
op_auto_link_text による自動リンクで使用される正規表現は次のように定義されている。
<pre><code class="php">
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');
</code></pre>
この正規表現はUTF-8モードが有効となっており(末尾の @u@ オプションによる)、このモードではpreg_match内部でPCREに対して PCRE_UCF オプションが使用される。このオプションでは @\d@, @\D@, @\s@, @\S@, @\w@, @\W@ などの *重要な* 文字クラスの挙動が変わり、例えば @\d@ は全角数字にもマッチし、 @\w@ は漢字や平仮名にもマッチするようになる。これによって、ドメイン部分の @[-\w]+@ に日本語のテキストがマッチしてしまうため前述のような現象が起こる。
h4. 参考
* "PHP :: Bug #52971 :: PCRE-Meta-Characters not working with utf-8":https://bugs.php.net/bug.php?id=52971
* "php-src/ext/pcre/php_pcre.c at master · php/php-src · GitHub":https://github.com/php/php-src/blob/master/ext/pcre/php_pcre.c#L359-L366
h3. 修正内容
SF_AUTO_LINK_RE で使用されている @\w@, @\s@, @\d@ を @[0-9A-Za-z]@, @\ @, @[0-9]@ にそれぞれ置き換える。