Создание хэштега в Javascript без сопоставления имен якорей, BBCode или экранированных символов - PullRequest
1 голос
/ 30 апреля 2010

Я хотел бы преобразовать все экземпляры хэштега в строке в связанный URL:

# hashtag -> должен иметь связанный "#hashtag".
Это #hashtag -> должен быть связан с #hashtag.
Это [url = http://www.mysite.com/#name]named якорь [/ url] -> должен не быть связанным.
Это не очень хороший способ использовать кавычки -> должен не быть связанным.

Вот мой текущий код:

String.prototype.parseHashtag = function() {
 return this.replace(/[^&][#]+[A-Za-z0-9-_]+(?!])/, function(t) {
  var tag = t.replace("#","")
  return t.link("http://www.mysite.com/tag/"+tag);
 });
};

В настоящее время это, по-видимому, исправляет экранированные символы (исключая совпадения с амперстендом), обрабатывает именованные якоря, но не связывает #hashtag, если это первое, что есть в сообщении, и, кажется, захватывает включение -2 символа до "#" в ссылке.

Halp!

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Как насчет следующего:

/(^|[^&])#([A-Za-z0-9_-]+)(?![A-Za-z0-9_\]-])/g

соответствует хэштегам в вашем примере. Поскольку JavaScript не поддерживает lookbehind, он пытается совпасть с началом строки или любым символом, кроме & перед хэштегом. Это захватывает последний, таким образом это может позже быть заменено. Также записывается имя хэштега.

Так, например:

subject.replace(/(^|[^&])#([A-Za-z0-9_-]+)(?![A-Za-z0-9_\]-])/g, "$1http://www.mysite.com/tag/$2");

преобразует

#hashtag
This is a #hashtag and this one #too.
This is a [url=http://www.mysite.com/#name]named anchor[/url]
This isn't a pretty way to use quotes

в

http://www.mysite.com/tag/hashtag
This is a http://www.mysite.com/tag/hashtag and this one http://www.mysite.com/tag/too.
This is a [url=http://www.mysite.com/#name]named anchor[/url]
This isn't a pretty way to use quotes

Возможно, это не то, что t.link() (которого я не знаю) вернул бы, но я надеюсь, что это хорошая отправная точка.

1 голос
/ 30 апреля 2010

Существует гем Ruby с открытым исходным кодом для таких вещей (хэштеги и @usernames), который называется twitter-text . Вы можете получить некоторые идеи и регулярные выражения из этого или попробовать этот порт JavaScript .

Используя порт JavaScript, вам нужно просто сделать:

var linked = TwitterText.auto_link_hashtags(text, {hashtag_url_base: "http://www.mysite.come/tag/"});
0 голосов
/ 04 мая 2010

Тим, ваше решение было почти идеальным. Вот что я использовал в итоге:

subject.replace(/(^| )#([A-Za-z0-9_-]+)(?![A-Za-z0-9_\]-])/g, "$1<a href=\"http://www.roleplaygateway.com/tag/$2\">#$2</a>");

Единственное изменение - это первое условное выражение, изменившее его так, чтобы оно соответствовало началу строки или пробела. (Я пытался \ s, но это совсем не сработало.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...