Ответ 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