找回密码
 快速注册
搜索
查看: 73|回复: 13

链接省略号 test

[复制链接]

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-9-19 22:58 |阅读模式
本帖最后由 kuing 于 2024-9-20 02:20 编辑 形如 [url]链接[/url] 的链接如果比较长,中间会变成省略号。

从 \source\function\function_discuzcode.php 里查到,在第 374 行起的 function parseurl 这函数里,有个 $length = 65;(见这里)应该就是长与短之分界线,来测试一下:

65 个字符的:http://8901234567890123456789012345678901234567890123456789012345

66 个字符的:http://8901234567890123456789012 ... 8901234567890123456

本论坛由于域名有点长,就算是最早的帖子,tid 是个位数,链接也超过了这长度,所以也会有省略号:
https://kuing.cjhb.site ... iewthread&tid=4
(如果数一下,会发现
https://kuing.cjhb.site/forum.php?mod=viewthread&tid=4
这才 63 个字符啊?
别忘了,& 在 html 里会变成 & 相当于 5 个字符,所以实际上是 67,超了两个,验证如下:
去掉 4:https://kuing.cjhb.site ... viewthread&tid=
去掉 =4:https://kuing.cjhb.site/forum.php?mod=viewthread&tid


省略号虽然节省空间,但有点不好就是:
要复制链接,就得右键复制,而如果用户是通过左键选择来复制(例如想复制一大片文字,而链接在中间),这时就只会复制到省略号的文本,链接就错了。
实例:https://kuing.cjhb.site ... hread&tid=12726 的 2 楼在复制 1 楼内容时就出现这种情况。(正是该帖触发我发本帖)

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-20 02:38
本帖最后由 kuing 于 2024-9-23 21:25 编辑 于是我决定将分界值改大一点,直接加大到 100,好像还不够,再加 5 吧。
===== 9-23 更新 =====
加大到 95,并自动隐藏 http:// 或 https:// 及其后的 www.(实际链接中还在,只是不显示)
相关代码改为:
  1. function parseurl($url, $text, $scheme) {
  2.     global $_G;
  3.     if(!$url && preg_match("/((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|qqdl|synacast){1}:\/\/|www\.)[^\[\"']+/i", trim($text), $matches)) {
  4.         $url = $matches[0];
  5.         $text = preg_replace("/^https?:\/\/(www\.)?|^www\./i", '', $url); // kk add
  6.         $length = 95; // ori:65
  7.         if(strlen($text) > $length) {
  8.             //$text = mb_substr($url, 0, intval($length * 0.5)).' ... '.mb_substr($url, - intval($length * 0.3));
  9.             $text = mb_substr($text, 0, 64).' ... '.mb_substr($text, -20);
  10.         }
  11.         return '<a href="'.(substr(strtolower($url), 0, 4) == 'www.' ? 'http://'.$url : $url).'" target="_blank">'.$text.'</a>';
  12.     } else {
  13. ......
复制代码

(其中 mb_substr($text, 0, 64) 的这个数字确保能看到“tid=五位数”,将来上升到六位数时再加一)
测试:
  1. [url]http://&&&&&&&&&&&&&&&&&&&[/url](一个 & 为 5 个字符,此链接相当于 95 个字符)
  2. [url]http://&&&&&&&&&&&&&&&&&&&1[/url](加个 1)
复制代码

显示:
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& ... amp;&&&1

常规帖子链接:
kuing.cjhb.site/forum.php?mod=viewthread&tid=12737
带一些 page、extra、#pid 等:
kuing.cjhb.site/forum.php?mod=viewthread&tid=12737&extra=page%3D10
kuing.cjhb.site/forum.php?mod=viewthread&tid=12737&page=1&extra=page%3D10
kuing.cjhb.site/forum.php?mod=viewthread&tid=12737&page=1&extra=#pid61493
kuing.cjhb.site/forum.php?mod=viewthread&tid=12737&page=1&extra=page%3D1#pid61493
点右上角 # 号处复制的链接:
kuing.cjhb.site/forum.php?mod=redirect&goto=findpost&ptid=12737&pid=61501

应该绝大多数论坛帖子链接都没有省略号了(包括楼上最后那实例)

  1. [url]https://www.baidu.com/[/url]
  2. [url]www.baidu.com/[/url]
复制代码

显示:
baidu.com/
baidu.com/

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-9-20 03:03
去年讨论过关于&amp;引起的问题 gitee.com/Discuz/DiscuzX/issues/I71F68
有时它会被错误地切成amp;希望修复!

点评

懒得搞,按 2# 的改动,现在至少论坛链接绝大多数不会切。  发表于 2024-9-20 03:46

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-9-20 03:12
建议使用 Discuz 默认的富文本编辑器来粘贴链接。这样粘贴链接只需要按一次 Ctrl+V,链接 URL 和链接文本都会被粘贴。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-21 21:24
本帖最后由 kuing 于 2024-9-22 19:05 编辑 emmmm....
或许还可以考虑自动省去 http:// 之类的……
还有 &page=1 应是是多余的,只有 page=2 以上才有意义吧,那 =1 时可以省去……
还有 &extra=page%3D1,这是控制返回主题列表时回到第几页,其实完全不用显示出来(我简直觉得这参数几乎没啥用处……
还有时候 &extra=空……
这样的话分界值就可以更小一些……

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-22 19:07
本帖最后由 kuing 于 2024-9-22 19:14 编辑 我甚至想从源头(模板)上去掉 &page=1 和 &extra=page%3D1或空,但似乎很困难,相关东西似乎很多……

首先在 \template\default\forum\discuz.htm 删去里面的三个 &extra=$extra ,这样首页四格的 &extra= 就没了。

然后到 \template\default\forum\forumdisplay_list.htm
将 L163 的
  1. <a href="forum.php?mod=viewthread&tid=$thread[tid]&{if $_GET['archiveid']}archiveid={$_GET['archiveid']}&{/if}extra=$extra" ......
复制代码

改为
  1. <a href="forum.php?mod=viewthread&tid=$thread[tid]{if $_GET['archiveid']}&archiveid={$_GET['archiveid']}{/if}{if $extra != 'page%3D1'}&extra=$extra{/if}" ......
复制代码

就是套了一个条件 {if $extra != 'page%3D1'} ,这样主题列表的第一页就不会有 &extra=page%3D1 ,第二页起才有。

其他的还不知道在哪改。
比如说,即使进入最简洁链接的帖子里,在编辑某个帖子提交之后跳转的链接一定带 &extra= ,也不知道在哪控制的。
求助 @hbghlyj

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-9-22 21:02
kuing 发表于 2024-9-22 11:07
比如说,即使进入最简洁链接的帖子里,在编辑某个帖子提交之后跳转的链接一定带 &extra= ,也不知道在哪控制的。


也许可以询问官方 gitee.com/Discuz/DiscuzX/issues

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-22 21:08
本帖最后由 kuing 于 2024-9-22 22:39 编辑

这点无关重要的无聊问题不会有人鸟的,甚至会被认为是吃饱了撑。

我好像找到了,估计是这里:
gitee.com/Discuz/DiscuzX/blob/master/upload/source/include/post/post_editpost.php#L310
  1. $modpost->param('redirecturl', "forum.php?mod=viewthread&tid=$_G[tid]&page=$_GET&extra=$extra".($vid && $isfirstpost ? "&vid=$vid" : '')."#pid$pid");
复制代码

奇怪,上面这段代码的 _GET 后面的 【page】 不见了(只要【】写成 [ ] 就会不见

如果我想加个条件,当 $extra 非空时才有 &extra=$extra,怎么写呢?(其实我都不知道在什么情况下会非空)
去掉 &extra=$extra,在中间那里接 .($extra ? "&extra=$extra" : '') 吗?
好像可以耶……

那类似地,&page=$_GET 是不是也可以弄成
.($_GET['page'] == 1 ? '' : "&page={$_GET['page']}")

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-22 23:01
咦,我发现 gitee 上的代码和本论坛正在使用的有点细节不同。
比如 8# 提到的那句,gitee 上的 &tid=$_G[tid],而在本论坛模板里是 &tid={$_G['tid']}
多个花括号,以及引号,这有什么区别嘛?

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-9-22 23:06
kuing 发表于 2024-9-22 15:01
多个花括号,以及引号,这有什么区别嘛?


我想,它们的效果一样?

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-22 23:12
本帖最后由 kuing 于 2024-9-23 17:57 编辑
hbghlyj 发表于 2024-9-22 23:06
我想,它们的效果一样?


不知道。
但我发现可能是我在 gitee 上没找对版本,这个 v3.5 的就和论坛上一样了:
gitee.com/Discuz/DiscuzX/blob/v3.5/upload/source/include/post/post_editpost.php#L312
  1. $modpost->param('redirecturl', "forum.php?mod=viewthread&tid={$_G['tid']}&page={$_GET['page']}&extra=$extra".($vid && $isfirstpost ? "&vid=$vid" : '')."#pid$pid");
复制代码

这样粘贴过来也不会有 page 不见的问题,因为有了引号
目前的改法是改成:
  1. $modpost->param('redirecturl', "forum.php?mod=viewthread&tid={$_G['tid']}".($_GET['page'] == 1 ? '' : "&page={$_GET['page']}").($extra ? "&extra=$extra" : '').($vid && $isfirstpost ? "&vid=$vid" : '')."#pid$pid");
复制代码

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2024-9-24 17:18
多页的帖子的页码跳转链接里的 extra=... :
gitee.com/Discuz/DiscuzX/blob/v3.5/upload/source/module/forum/forum_viewthread.php#L504
  1. '&amp;extra='.$_GET['extra'].
复制代码

改为
  1. ($_GET['extra'] ? '&amp;extra='.$_GET['extra'] : '').
复制代码

这样只有当链接中确实有 extra 时才有 extra。
测试结果看来正常。

另外,我看到后面还有很多类似于
  1. (!empty($_GET['authorid']) ? ... : ... )
复制代码

的写法,用 !empty 有什么好处呢?为什么不简化成
  1. ($_GET['authorid'] ? ... : ... )
复制代码

呢?@hbghlyj

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:11

Powered by Discuz!

× 快速回复 返回顶部 返回列表