2012-02-13 12 views
15

Próbuję napisać wyrażenie regularne, które zastępuje linki stylu obniżki, ale wydaje się, że nie działa. Oto, co mam do tej pory:Jak przekonwertować łącza stylu Markdown za pomocą wyrażeń regularnych?

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

Co robię źle?

+0

Dlaczego nie korzystać z pełnej biblioteki Ruby Markdown, jak wspaniałą [kramdown] (http : //kramdown.rubyforge.org/)? – Phrogz

+0

ponieważ potrzebuję tylko ograniczonego podzbioru funkcji przecinania i nie znalazłem biblioteki, która pozwala mi określić, które funkcje chcę obsługiwać (więc muszę napisać własne). – Andrew

Odpowiedz

36
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>" 

Możemy użyć utrzymany opcję regex Ruby e x aby nie wyglądać jak kot wskoczył na klawiaturze:

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="http://www.example.com">link me up</a> 

Należy zauważyć, że powyższe zawiedzie dla adresów URL, które mają prawo nawias w nich, np

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

Jeśli jest to dla Ciebie ważne, wymienić [^)]+ z \S+(?=\)) co oznacza „znaleźć jak najwięcej non-spacjami znaków jak to możliwe, ale zapewniają, że istnieje ) potem”.


Aby odpowiedzieć na to pytanie "co robię źle", oto co Twój regex powiedział:

%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 
+0

świetne wyjaśnienie. dzięki! – Andrew

+1

również, nigdy nie widziałem adresu URL z nawiasami. Nawet nie myślałem, że to jest ważne. dzięki za wskazanie, że na zewnątrz – Andrew

+0

Niesamowite wyjaśnienie. W miarę możliwości dałoby więcej niż +1. Skończyłem robić matcher dla [składni]] składni za pomocą twoich rad. Oto moje podejście (uproszczone z twojego):/\\ [\\ [([^ \\]] +) \\] \\] /. –

Powiązane problemy