Нет результатов поиска при фильтрации по имени пользователя с юникодом

Я столкнулся с ошибкой: невозможно найти посты пользователя по @+имя_пользователя в поле поиска, если имя содержит символы Юникода (например, китайские \p{Han}).

Причина в том, что регулярное выражение в следующем коде (в файле lib\search.rb) сопоставляет только символы ASCII.

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

Я протестировал добавление allowed_unicode_username_characters в регулярное выражение (то есть добавление правила advanced_filter(/^\@([a-zA-Z0-9_\-.\p{Han}]+)$/i)), и всё работает корректно.

3 лайка

Отлично, да, мы определённо хотим это исправить: мы позволяем администраторам сайтов выбирать юникодные имена пользователей.

Не хотите попробовать отправить PR? Мы должны исправить это поведение только в том случае, если администратор сайта выбрал юникодные имена пользователей.

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 для ядра. Это ошибка в ядре. Однако в PR необходимо будет добавить тест.

2 лайка

Хорошо, я только что создал PR, можете посмотреть.

3 лайка

Объединено, спасибо за ваш вклад!

3 лайка

Эта тема была автоматически закрыта через 2 дня после последнего ответа. Новые ответы больше не принимаются.