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 による自動リンクで使用される正規表現は次のように定義されている。 の内部では、symfonyのヘルパー関数である auto_link_text (source:lib/vendor/symfony/lib/helper/TextHelper.php) が使用されている。この関数で使用する正規表現 SF_AUTO_LINK_RE が上記のようなテキストを考慮できていないことが原因である。 <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]+@ に日本語のテキストがマッチしてしまうため前述のような現象が起こる。 h3. 修正内容 これは本来symfony側のバグであるが、http://trac.openpne.jp/ticket/3553 のように SF_AUTO_LINK_RE で使用されている @\w@, @\s@, @\d@ を @[0-9A-Za-z]@, @\ @, @[0-9]@ にそれぞれ置き換える。 で定義される正規表現を上書きすることでsymfony側に手を加えずに対応することが可能であるため、同じような手段で修正する。