diff --git a/lib/helper/opUtilHelper.php b/lib/helper/opUtilHelper.php
index 5a17e9930..bf9c7a155 100644
--- a/lib/helper/opUtilHelper.php
+++ b/lib/helper/opUtilHelper.php
@@ -311,24 +311,24 @@ function op_format_date($date, $format = 'd', $culture = null, $charset = null)
{
define('SF_AUTO_LINK_RE', '~
( # leading text
- <\w+.*?>| # leading HTML tag, or
+ <[0-9A-Za-z]+.*?>| # leading HTML tag, or
[^=!:\'"/]| # leading punctuation, or
^| # beginning of line, or
- \s? # leading whitespaces
+ \ ? # leading whitespaces
)
(
(?:https?://)| # protocol spec, or
(?:www\.) # www.*
)
(
- [-\w]+ # subdomain or domain
- (?:\.[-\w]+)* # remaining subdomains or domain
- (?::\d+)? # port
+ [-0-9A-Za-z]+ # subdomain or domain
+ (?:\.[-0-9A-Za-z]+)* # remaining subdomains or domain
+ (?::[0-9]+)? # port
\/?
[a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]*
)
- ([[:punct:]]|\s|<|$) # trailing text
- ~x');
+ ([^a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]|\ |<|$) # trailing text
+ ~xu');
}
function op_url_cmd($text)
diff --git a/test/unit/helper/opUtilHelperTest.php b/test/unit/helper/opUtilHelperTest.php
index ab5aa5a7e..7e2eeeb83 100644
--- a/test/unit/helper/opUtilHelperTest.php
+++ b/test/unit/helper/opUtilHelperTest.php
@@ -75,3 +75,23 @@
Doctrine::getTable('SnsConfig')->set('nickname_of_member_who_does_not_have_credentials', 'I am a pen.');
$t->is(op_link_to_member(null), 'I am a pen.', 'set nickname_of_member_who_does_not_have_credentials original setting');
+
+//------------------------------------------------------------
+$t->diag('op_auto_link_text()');
+$t->is(op_auto_link_text('http://example.com/'), 'http://example.com/');
+$t->is(op_auto_link_text('https://example.com/'), 'https://example.com/', 'protocol');
+$t->is(op_auto_link_text('http://sub.example.com/'), 'http://sub.example.com/', 'subdomain');
+$t->is(op_auto_link_text('http://example.com/hoge'), 'http://example.com/hoge', 'path');
+$t->is(op_auto_link_text('http://example.com:8080/'), 'http://example.com:8080/', 'port');
+$t->is(op_auto_link_text('http://example.com/#foo'), 'http://example.com/#foo', 'anchor');
+$t->is(op_auto_link_text('http://example.com/?foo=1&bar=0'), 'http://example.com/?foo=1&bar=0', 'query');
+$t->is(op_auto_link_text('https://sub.example.com:8080/hoge?foo=1&bar=0#foo'), 'https://sub.example.com:8080/hoge?foo=1&bar=0#foo');
+$t->is(op_auto_link_text('http://example.com'), 'http://example.com');
+$t->is(op_auto_link_text('www.example.com'), 'www.example.com');
+// see https://trac.openpne.jp/ticket/3553
+$t->is(op_auto_link_text('http://example.com/#comment:1'), 'http://example.com/#comment:1');
+// see https://redmine.openpne.jp/issues/3289
+$t->is(op_auto_link_text('http://example.com/テキスト'), 'http://example.com/テキスト');
+$t->is(op_auto_link_text('http://example.com/hogeテキスト'), 'http://example.com/hogeテキスト');
+$t->is(op_auto_link_text('http://example.comテキスト'), 'http://example.comテキスト');
+$t->is(op_auto_link_text('http://example.com:8080/'), 'http://example.com:8080/'); // http://example.com:/ is valid URI.