summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util.php50
-rw-r--r--tests/HashTagDetectionTest.php2
2 files changed, 44 insertions, 8 deletions
diff --git a/lib/util.php b/lib/util.php
index d4e2841cd..29eb6cbbc 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -445,7 +445,7 @@ function common_replace_urls_callback($text, $callback, $notice_id = null) {
'(?:/[\pN\pL$\[\]\,\!\(\)\.\-\_\+\/\=\&\;]*)?'. // /path
'(?:\?[\pN\pL\$\[\]\,\!\(\)\.\-\_\+\/\=\&\;\/]*)?'. // ?query string
'(?:\#[\pN\pL$\[\]\,\!\(\)\.\-\_\+\/\=\&\;\/\?\#]*)?'. // #fragment
- ')(?<![\?\.\,\#\)\]\,])'.
+ ')(?<![\?\.\,\#\,])'.
')'.
'#ixu';
preg_match_all($regex,$text,$matches);
@@ -454,16 +454,52 @@ function common_replace_urls_callback($text, $callback, $notice_id = null) {
}
function callback_helper($matches, $callback, $notice_id) {
- $pos = strpos($matches[0],$matches['url']);
- $left = substr($matches[0],0,$pos);
- $right = substr($matches[0],$pos+strlen($matches['url']));
+ $url=$matches['url'];
+ $left = strpos($matches[0],$url);
+ $right = $left+strlen($url);
+
+ $groupSymbolSets=array(
+ array(
+ 'left'=>'(',
+ 'right'=>')'
+ ),
+ array(
+ 'left'=>'[',
+ 'right'=>']'
+ ),
+ array(
+ 'left'=>'{',
+ 'right'=>'}'
+ )
+ );
+ $cannotEndWith=array('.','?',',','#');
+ $original_url=$url;
+ do{
+ $original_url=$url;
+ foreach($groupSymbolSets as $groupSymbolSet){
+ if(substr($url,-1)==$groupSymbolSet['right']){
+ $group_left_count = substr_count($url,$groupSymbolSet['left']);
+ $group_right_count = substr_count($url,$groupSymbolSet['right']);
+ if($group_left_count<$group_right_count){
+ $right-=1;
+ $url=substr($url,0,-1);
+ }
+ }
+ }
+ if(in_array(substr($url,-1),$cannotEndWith)){
+ $right-=1;
+ $url=substr($url,0,-1);
+ }
+ }while($original_url!=$url);
+
+
if(empty($notice_id)){
- $result = call_user_func_array($callback,$matches['url']);
+ $result = call_user_func_array($callback,$url);
}else{
- $result = call_user_func_array($callback, array($matches['url'],$notice_id) );
+ $result = call_user_func_array($callback, array($url,$notice_id) );
}
- return $left . $result . $right;
+ return substr($matches[0],0,$left) . $result . substr($matches[0],$right);
}
function curry($fn) {
diff --git a/tests/HashTagDetectionTest.php b/tests/HashTagDetectionTest.php
index 71137b0b5..55e1f65bf 100644
--- a/tests/HashTagDetectionTest.php
+++ b/tests/HashTagDetectionTest.php
@@ -28,7 +28,7 @@ class HashTagDetectionTest extends PHPUnit_Framework_TestCase
array('hello',
'hello'),
array('#hello',
- '<a href="/tag/hello">hello</a>'),
+ '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('hello'))) . '" rel="tag">hello</a></span>'),
);
}
}