Как преобразовать ссылки в стиле Markdown с помощью regex?

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

# ruby code:
text = "[link me up](http://www.example.com)"
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>})

Что я делаю неправильно?

Ответы

Ответ 1

irb(main):001:0> text = "[link me up](http://www.example.com)"
irb(main):002:0> text.gsub /\[([^\]]+)\]\(([^)]+)\)/, '<a href="\2">\1</a>'
#=> "<a href=\"http://www.example.com\">link me up</a>"

Мы можем использовать параметр e x для регулярного выражения Ruby, чтобы он выглядел не так, как кошка прыгала на клавиатуре:

def linkup( str )
  str.gsub %r{
    \[         # Literal opening bracket
      (        # Capture what we find in here
        [^\]]+ # One or more characters other than close bracket
      )        # Stop capturing
    \]         # Literal closing bracket
    \(         # Literal opening parenthesis
      (        # Capture what we find in here
        [^)]+  # One or more characters other than close parenthesis
      )        # Stop capturing
    \)         # Literal closing parenthesis
  }x, '<a href="\2">\1</a>'
end

text = "[link me up](http://www.example.com)"
puts linkup(text)
#=> <a href="#" onclick="location.href='http://www.example.com'; return false;">link me up</a>

Обратите внимание, что приведенное выше не будет отображаться для URL-адресов, которые имеют в них правильную скобку, например

linkup "[O](http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85).aspx)"
# <a href="#" onclick="location.href='http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85'; return false;">O</a>.aspx)

Если это важно для вас, вы заменяете [^)]+ на \S+(?=\)), что означает "найти как можно больше не-пробельных символов", но убедитесь, что после этого есть ).


Чтобы ответить на ваш вопрос "что я делаю неправильно", вот что сказал ваш регулярный пример:

%r{
  \[      # Literal opening bracket   (good)
    (     # Start capturing           (good)
      \+  # A literal plus character  (OOPS)
    )     # Stop capturing            (good)
  \]      # Literal closing bracket   (good)
  \(      # Literal opening paren     (good)
    (     # Start capturing           (good)
      \+  # A literal plus character  (OOPS)
    )     # Stop capturing            (good)
  \)      # Literal closing paren     (good)
}x