如果按unicode用户名过滤,则没有搜索结果

我在搜索框中通过 @+用户名 搜索用户帖子时遇到了一个 bug,如果用户名包含 unicode(例如中文 \\p{Han}),则无法搜索。

原因是 lib\\search.rb 中以下代码使用的正则表达式仅匹配 ascii 字符。

advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) do |posts, match|\n```

我测试过,如果在正则表达式中添加 `allowed_unicode_username_characters`(即添加规则 `advanced_filter(/^\\@([a-zA-Z0-9_\\-.\\p{Han}]+)$/i)`),则可以正常工作。
3 个赞

好的,我们确实想解决这个问题。我们允许站点管理员选择 Unicode 用户名。

您愿意尝试提交一个 PR 吗?我们应该只在站点管理员选择 Unicode 用户名时修改此行为。

2 个赞

我使用一个插件通过以下代码添加了 advanced_filter,它满足了我的需求。

if SiteSetting.unicode_usernames?
    regexp = Regexp.new("(?i-mx:^(?:\\@([a-zA-Z0-9_\\-#{SiteSetting.allowed_unicode_username_characters}]+)$))")
    Search.advanced_filter(regexp) do |posts, match|
      username = match.downcase
  
      user_id = User.where(staged: false).where(username_lower: username).pluck_first(:id)
  
      if !user_id && username == "me"
        user_id = @guardian.user&.id
      end
  
      if user_id
        posts.where("posts.user_id = #{user_id}")
      else
        posts.where("1 = 0")
      end
    end
  end

但我不知道如何正确修改核心,特别是当 allowed_unicode_username_characters 是一个变量时。也许一个简单但可能错误的解决方案是将 advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) 改为 advanced_filter(/^\\@(.+)$/i),就像你在 advanced_filter(/^user:(.+)$/i) 中做的那样。

2 个赞

我认为提交一个 PR 到核心是解决这个问题的办法。这是核心的一个 bug。你需要在 PR 中添加一个测试。

2 个赞

好的,我刚才提交了一个 PR,你可以看一下。

3 个赞

已合并,感谢您的贡献!

3 个赞

该主题已在上次回复后自动关闭2天。不再允许新回复。