Регулярное выражение для нормализации ссылок на темы в форуме Discourse

Я использую программное обеспечение для форума Discourse. Как и в текущем состоянии, Discourse представляет ссылки на тему двумя способами: с номером сообщения в конце и без него.

Пример:

forum.domain.com/t/some-topic/23
forum.domain.com/t/some-topic/23/5

Первый - это то, что я хочу, а второй я хочу, чтобы вообще не отображался на форуме.

Я написал пост об этом на форуме Discourse, но не получил ответа, какое регулярное выражение добавить в поле ввода для нормализации постоянной ссылки в разделе администратора.

Мне сказали, что есть возможность сделать это с помощью нормализации постоянной ссылки, например (это пример, показанный в админке под текстом ввода Regex, я его не писал):

permalink normalizations

Apply the following regex before matching permalinks,
for example: /(topic.)\?./\1 will strip query strings from topic routes.
Format is regex+string use \1 etc. to access captures

Я не знаю, какое регулярное выражение мне следует использовать, чтобы удалить числовое значение номера сообщения из ссылок. Мне это нужно только для тематических ссылок.

Это библиотека маршрутизации routes.rb, а это < библиотека href="https://github.com/discourse/discourse/blob/master/app/models/permalink.rb" rel="nofollow">permalink.rb (я думаю, что библиотека постоянных ссылок должна помочь лучше понять, как этого добиться). Я понятия не имею, как к этому подойти, потому что кажется, что мне нужны некоторые знания о маршрутизации Discourse, чтобы заставить его работать. Например, я не понимаю, почему (topic.) является частью регулярного выражения, что это значит, поэтому их пример не помогает мне найти решение.

В админке у меня есть поле ввода, в которое мне нужно поместить код регулярного выражения нормализации.

Мне нужна помощь с Regex. Мне нужно, чтобы регулярное выражение работало со всеми темами.

Что я пробовал, но не получилось:

/(\/\d+)\/\d+$/\1

/(t/[^/]+/\d+).*/\1

/(\/\d+)\/[0-9]+$/\1

/(\/\d+)\/[0-9]+/\1

/(\/\d+)\/\d+$/\1/

/(forum.domain.com(\/\w+)*\/\d+)\/\d+(?=\s|$)/\1

Примечание. В поле ввода "Нормализация постоянной ссылки" символ | используется как разделитель для разделения нескольких выражений Regex.


person Idan Shechter    schedule 09.07.2016    source источник
comment
Я не знаю Discourse или его управление постоянными ссылками, но регулярное выражение для того, что вы хотите, может быть /(\/\d+)\/\d+$/\1. Многое зависит от того, какие функции регулярных выражений поддерживает Discourse. Возможно, вам придется обойтись без $ и/или заменить каждый \d на [0-9].   -  person trincot    schedule 09.07.2016
comment
@trincot /t/ обозначает тему в дискурсе, хотя я не знаю, что в примере они поместили (тема), вероятно, что-то, связанное с кодированием обратной маршрутизации в Discourse.   -  person Idan Shechter    schedule 09.07.2016
comment
Может ^/(t/some-topic/\d+).*/\1? Если регулярное выражение получает ввод строки как /t/some-topic/23, когда у вас есть forum.domain.com/t/some-topic/23, это может сработать. Вам действительно предложили /(topic.*)\?.*/\1, звездочки утеряны из-за плохого форматирования.   -  person Wiktor Stribiżew    schedule 09.07.2016
comment
Я не думаю, что полезно жестко закодировать некоторую тему в вашем регулярном выражении, поскольку вы хотите, чтобы она работала для любой темы. Кроме того, я совершенно уверен, что t будет восприниматься как литерал, если вы, возможно, не поставите перед ним escape-символ. Я искал документацию Discourse по этому вопросу, но ничего не нашел. Вы пробовали то, что я предложил?   -  person trincot    schedule 09.07.2016
comment
@WiktorStribiżew the /(topic.*)\?.*/\1 — это не мои предложения, это пример в Discourse. Я сделаю резервную копию сервера и попробую ваше регулярное выражение.   -  person Idan Shechter    schedule 09.07.2016
comment
Если у вас есть конкретная тема, жестко закодируйте ее. Если нет, раздел может быть выражен как [^/]+. Скажем, для сопоставления /t/this/45 и /t/that/65 можно использовать /t/[^/]+/\d+. Чтобы использовать группы захвата, поместите (....) вокруг части, которую нужно сохранить, и укажите это значение с помощью \+цифры, которая соответствует порядку появления группы захвата. Итак, вы можете попробовать /(t/[^/]+/\d+).*/\1 или /^(/t/[^/]+/\d+).*/\1 (в зависимости от того, что означает /.../ в примере).   -  person Wiktor Stribiżew    schedule 09.07.2016
comment
Мне нужно это для всех тем, я обновлю вопрос   -  person Idan Shechter    schedule 09.07.2016
comment
@trincot Я попробовал ваше предложение /(\/\d+)\/\d+$/\1, и оно ничего не изменило (я исключил это предложение из вопроса)   -  person Idan Shechter    schedule 09.07.2016
comment
Вы пробовали варианты, которые я предложил (удаление $, замена \d...)?   -  person trincot    schedule 09.07.2016
comment
@trincot попробовал их оба безуспешно   -  person Idan Shechter    schedule 09.07.2016
comment
@trincot Я нашел библиотеку постоянных ссылок, может быть, это поможет: github .com/discourse/discourse/blob/master/app/models/   -  person Idan Shechter    schedule 09.07.2016
comment
Я посмотрю на это. На первый взгляд я вижу, что выражение должно заканчиваться на /, поэтому не могли бы вы попробовать /(\/\d+)\/\d+$/\1/ с косой чертой в конце?   -  person trincot    schedule 09.07.2016
comment
@trincot все еще не работает :(   -  person Idan Shechter    schedule 09.07.2016
comment
Я предлагаю вам пометить свой вопрос тегом ruby on rails, так как дискурс, похоже, написан в нем, а также поместить эту ссылку на github в свой вопрос. Вам нужно привлечь к своему вопросу рубиновых программистов :)   -  person trincot    schedule 09.07.2016


Ответы (3)


Я думаю, что это может быть выражение, которое вы ищете, чтобы поместить в поле настроек:

/(t\/.*\/\d+)(\/\d+)/\1

Вы можете видеть, как он работает на Rubular.

Однако код, генерирующий URL, код нормализации не используется, поэтому выражение игнорируется.

Вы можете попробовать нормализовать постоянную ссылку:

def last_post_url
  url = "#{Discourse.base_uri}/t/#{slug}/#{id}/#{posts_count}"
  url = Permalink.normalize_url url
  url
end
person chipairon    schedule 12.07.2016

Я не совсем понял ваш вопрос, но если я правильно понял, вы говорите, что вам нужны ссылки с /some-number в конце, но не какие ссылки с /some-number/some-number в конце. Если это так, регулярное выражение:

forum\.domain\.com\/t\/[^0-9\/]+\/\d{1,9}$

Вы можете заменить «форум» на ваше имя форума и «домен» на ваше доменное имя.

person Kanav Hasija    schedule 09.07.2016
comment
Ссылки на темы должны быть только с одной цифрой в конце, обозначающей идентификатор темы, но не со второй цифрой, обозначающей идентификатор сообщения в теме. Мне также нужно, чтобы регулярное выражение было совместимо с Discourse. Они привели пример (который я показал в вопросе) и сказали мне следовать тем же правилам. - person Idan Shechter; 09.07.2016

Это удалит конечный "/<digits>" после другого "/<digits>":

/(forum.domain.com(\/\w+)*\/\d+)\/\d+(?=\s|$)/\1
person Bohemian♦    schedule 09.07.2016
comment
Я попробовал это, Discourse по-прежнему показывает ссылки с идентификатором сообщения в конце (как второе числовое значение). Может быть, «тема». что-то значит для регулярного выражения в Discourse, потому что я не знаю, почему они используют тему. в их примере, может быть, это нужно. - person Idan Shechter; 09.07.2016
comment
@IdanShechter попробуйте сейчас (при условии, что Discourse поддерживает прогнозирование) - person Bohemian♦; 09.07.2016
comment
Это нарушает регулярное выражение в поле ввода, вероятно, символ, который разделяет разные выражения регулярного выражения. Поле ввода может принимать несколько выражений регулярных выражений, и если я скопирую и вставлю ваше регулярное выражение, оно разорвется после ?=\s, сделает регулярное выражение из остальных и оставит $)/\1 в качестве нового текста - person Idan Shechter; 09.07.2016
comment
Это библиотека постоянных ссылок: github.com/discourse/discourse/ блоб/мастер/приложение/модели/ - person Idan Shechter; 09.07.2016