正则替换的方法:
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 PRO 被 @ 的提醒,是在提交的时候处理的 前端显示的时候再次把所有 @ 转换成链接,也有可能会缓存格式化的内容,这样就省去每一次显示的时候格式化 |
![]() | 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 压根不需要什么正则,就算你 @不存在的依然会显示链接。 在打开 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 run2 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 ``` |