Как я могу сопоставить URL, но исключить терминаторы из совпадения? - PullRequest
3 голосов
/ 27 марта 2011

Я хочу сопоставить URL-адреса в тексте и заменить их тегами привязки, но я хочу исключить некоторые терминаторы, например, как Twitter сопоставляет URL-адреса в твитах.

Пока у меня есть это, но, очевидно, оно работает не очень хорошо.

(http[s]?\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?)

РЕДАКТИРОВАТЬ: Некоторые примеры URL. Во всех случаях ниже я хочу только соответствовать "http://www.example.com"

http://www.example.com.

http://www.example.com:

"http://www.example.com"

http://www.example.com;

http://www.example.com!

* * Тысяча двадцать-одина [http://www.example.com]

{http://www.example.com}

http://www.example.com*

Ответы [ 4 ]

2 голосов
/ 28 марта 2011

URI-модуль Ruby имеет метод extract, который используется для анализа URL-адресов из текста.Синтаксический анализ возвращаемых значений позволяет вам использовать эвристику в модуле для извлечения схемы и информации о хосте из URL, избегая повторного изобретения колеса.

text = '
http://www.example.com.
http://www.example.com:
"http://www.example.com"
http://www.example.com;
http://www.example.com!
[http://www.example.com]
{http://www.example.com}
http://www.example.com*
http://www.example.com/foo/bar?q=foobar
http://www.example.com:81
'

require 'uri'

puts URI::extract(text).map{ |u| uri = URI.parse(u); "#{ uri.scheme }://#{ uri.host[/(^.+?)\.?$/, 1] }" }

# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com
# >> http://www.example.com

Единственное, что нужно, это то, что период '.' равендопустимый символ в имени хоста, поэтому URI # host его не удалит.Они попадают в оператор карты, где URL перестраивается.Обратите внимание, что URI удаляет путь и информацию запроса.

2 голосов
/ 27 марта 2011

Я рассмотрел эту проблему в прошлом году и разработал решение, на которое вы, возможно, захотите взглянуть. См .: URL Linkification (HTTP / FTP) Эта ссылка является тестовой страницей для решения Javascript, в котором многопримеры сложных для ссылки URL-адресов.

Мое решение для регулярных выражений, написанное как для PHP, так и для Javascript - (но его можно легко перевести на Ruby), не простое (но, как выясняется, и это не проблема).Для получения дополнительной информации я бы рекомендовал также прочитать:

Проблема с URL-адресами Джеффа Этвуда и
Улучшенный либеральный, точный шаблон регулярных выражений для сопоставления URL-адресов отДжон Грубер

Комментарии к сообщению в блоге Джеффа необходимо прочитать, если вы хотите сделать это правильно ...

1 голос
/ 28 марта 2011

Прагматичное и простое для понимания решение:

regex = %r!"(https?://[-.\w]+\.\w{2,6})"!

Некоторые заметки:

  • С помощью% r мы можем выбрать начальный и конечный разделители. В этом случае я использовал восклицательный знак, так как хочу использовать косую черту без экранирования в регулярном выражении.
  • Необязательный квантификатор (т. Е. '?') Связывается только с предыдущим выражением, в данном случае 's'. Нет необходимости ставить 's' в классе символов [s]?. Это так же, как s?.
  • Внутри класса персонажа [-.\w] нам не нужно экранировать тире и точку, чтобы они буквально совпадали с точкой и тире. Тире должно быть первым, но не означать дальность.
  • \w соответствует [A-Za-z0-9_] в Ruby. Это не совсем полное определение символов URL, но в сочетании с тире и точкой этого может быть достаточно для наших нужд.
  • Топ доменов длиной от 2 до 6 символов, например '.se' и '.travel'
  • Я не уверен, что вы подразумеваете под Я хочу исключить некоторые терминаторы , но это регулярное выражение соответствует только искомому в вашем примере.
  • Мы хотим использовать первую группу захвата, например, как это:

    if input = ~% r! "(Https?: // [-. \ W] +. \ W {2,6})"!

    match = $ ~ [1]

    еще

    match = ""

    конец

0 голосов
/ 28 марта 2011

Как насчет этого?

%r|https?://[-\w.]*\w|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...