V2EX 中 @ 一个人是怎么实现的?

2016-10-21 11:24:30 +08:00
 shawshi
前端的 @ 默认是如何实现的我已经知道,但是传递到后端 [ @xxx ] ,再次在页面上显示时是怎么处理的?
5627 次点击
所在节点    Python
32 条回复
bumz
2016-10-21 18:55:30 +08:00
后端正则,转成链接

猜想证实:

@aaaaaaaaaaaaa

查看页面源码,发现一个不存在的用户被服务器加上链接。
bumz
2016-10-21 19:00:16 +08:00
@Lpl 不可能是前端做的,否则后端必须检查一遍数据的合法性,这和直接后端做没有区别,徒增复杂度,否则可被利用。
bumz
2016-10-21 19:03:24 +08:00
已证实,不是前端做的

Lpl
2016-10-21 19:04:51 +08:00
@bumz
这个后端解析是肯定解析了,不然没有办法发送站内通知。
但是前端页面显示的时候也有可能会直接做匹配,然后替换成 a 链接,比如我下边 @一个不存在的人


@乔布斯
@不知道中文是否支持
@如果中文支持,
@那么应该就是在前端做替换了
@如果不支持
@那就是在后端解析的
@因为注册时候不让用中文
@testing
Lpl
2016-10-21 19:09:01 +08:00
@Lpl 但是呢,也有可能是前端判定是否符合用户名规范之类的。

所以,就看哪种会更有效率一点
bumz
2016-10-21 19:16:35 +08:00
@Lpl 后端替换的链接。

Lpl
2016-10-21 19:50:35 +08:00
@bumz 嗯..是后端替换的
qweweretrt515
2016-10-21 20:50:02 +08:00
IanPeverell
2016-10-22 10:33:22 +08:00
不过有一点比较有意思,就是列表只能展示出该主题下发过言的用户
也许是前端储存了该帖内的参与人员信息,然后在正则替换也说不定
sobigfish
2016-10-22 20:05:13 +08:00
@IanPeverell 就在页面里啊,还用猜?
$("#reply_content").textcomplete([{
match: /(^|\s)@(\w*)$/,
search: function (term, callback) {
term = term.toLowerCase();
var words= [.....
honmaple
2016-10-23 14:27:53 +08:00
以前写过类似的功能
```
def at_user(self, content):
usernames = findall(r'@([\u4e00-\u9fa5\w\-]+)', content)
ex_usernames = []
for username in usernames:
user = User.query.filter_by(username=username).first()
if user is not None and username != current_user.username:
ex_usernames.append(user.username)
href = '/u/' + username
u = '@' + username + ' '
content = content.replace(u, '@<a href="%s">%s</a> ' %
(href, username))
usernames = list(set(ex_usernames))
return content, usernames

```
shawshi
2016-11-04 15:59:10 +08:00
@shawshi 测试 @功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/314362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX