正则替换的方法:
def replaceContent(self, content):
pattern = r'@(.*?) '
def repl(match):
if match.group(0):
_link_name = match.group(0)
link_name = re.findall(pattern, _link_name)
return '@<a href="/member/' + link_name[0] + '">' + link_name[0] + '</a> '
content = re.sub(pattern, repl, content)
return content
需要内容替换直接掉这个方法就好了
最后的最后 去了解一下 re.sub 中第二个参数
1
nanlong 2016-10-21 11:34:52 +08:00
正则替换
|
2
helloccav 2016-10-21 11:37:41 +08:00
/\s@(.*?)\s/
通过正则提取出主题、回复里出现过的所有用户名,传递到后端检查用户是否传在,传在就加上正超链接 |
3
cheetah 2016-10-21 11:42:50 +08:00
存储的时候转为用户 id 存
|
7
21grams 2016-10-21 12:06:00 +08:00
在发帖的时候就已经替换了吧
|
8
lrh3321 2016-10-21 12:06:05 +08:00
页面上看到的应该只是正则替换,@不存在的 ID 仍然 会有下划线
后台可能是检测下被 @ 的人是否存在,然后发通知过去吧 |
10
qiayue 2016-10-21 12:09:06 +08:00
被 @ 的提醒,是在提交的时候处理的
前端显示的时候再次把所有 @ 转换成链接,也有可能会缓存格式化的内容,这样就省去每一次显示的时候格式化 |
12
Lpl 2016-10-21 12:11:24 +08:00 via Android
|
13
shawshi OP @Lpl 应该是在将回复数据保存到数据库时 做了正则替换。他保存到数据库时就是 带 html 格式的回复内容。知乎直接使用的 div 做的富文本编辑器,他在前端 @完就会生成带有连接的 a 标签。
|
14
wyntergreg 2016-10-21 12:26:29 +08:00
前端正文正则匹配
提交后端队列提醒 |
15
dong3580 2016-10-21 13:26:08 +08:00
压根不需要什么正则,就算你 @不存在的依然会显示链接。
在打开 https://www.v2ex.com/member/xxxx 这个页面检查一次当前用户是否存在。 至于收到提醒,插入一条记录呀,没有也插入呀,反正 @没有的人不存在。 测试: @aaaaaaab 这里 带空格 @aaaaaaab 这里 不带空格 @这里 汉字 @aaaaaaab,这里 带标点 @aaaaaaab ,这里 带标点和空格 |
16
laduary 2016-10-21 13:31:16 +08:00
|
17
ruandao 2016-10-21 13:42:31 +08:00
@史蒂夫流口水了电风扇的饭了
|
18
shawshi OP @dong3580 后台需要用正则去处理你提交的内容。因为那个正则无法匹配到中文,所以那儿就没有显示超链接。 @不存在的人,因为后端没有验证处理。
|
19
Immortal 2016-10-21 14:18:07 +08:00
看前面讨论的
我插楼问个问题 对于这种 @后的内容提取,比如用户名 是前端提取后当,单独当一个参数给后台 还是前端什么都不管 纯粹交给后台去正则处理 ...主要考虑到如果 @功能用的人多 正则性能又低下的话 |
20
StevenTong 2016-10-21 14:22:04 +08:00
|
21
bumz 2016-10-21 18:55:30 +08:00
|
23
bumz 2016-10-21 19:03:24 +08:00
已证实,不是前端做的
|
24
Lpl 2016-10-21 19:04:51 +08:00 via Android
|
28
qweweretrt515 2016-10-21 20:50:02 +08:00
|
29
IanPeverell 2016-10-22 10:33:22 +08:00
不过有一点比较有意思,就是列表只能展示出该主题下发过言的用户
也许是前端储存了该帖内的参与人员信息,然后在正则替换也说不定 |
30
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= [..... |
31
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 ``` |