레일스 및 문자열 검색을위한 regexp에 대한 연구가 끝나면 제 질문에 대한 답을 찾았습니다. 여기에 내가 지금 사용하고 방법에 대한 코드입니다 : 때문에 내가 정규 표현식을 공식화하는 방식의
def replace_slugs(text, characters)
# Regexp that will recognize wiki urls with pipes and return 2 items
# It also ignores wiki urls that don't have a pipe
# /\[\[:([^|\]]*)?\|([^\]]+)\]\]/
links = text.scan(/\[\[:([^|\]]*)?\|([^\]]+)\]\]/)
for link in links do
slug = link[0]
title = link[1]
# I'm stripping out the whitespace when I do my find and for my link
# This makes it so you can have whitespace before and after the pipe
# e.g. [[:slug|Title]] [[:slug | Title]] [[:slug | Title]]
ch = characters.find_by_slug(slug.strip)
text.gsub!("[[:#{slug}|#{title}]]", link_to(title.strip,
adventure_character_path(ch.adventure, ch))) if ch
end
slugs = text.scan(/\[{2}:([^\]]*)\]{2}/).map{|s|s[0]}
characters.where(:slug => slugs).each{|ch| text.gsub!("[[:#{ch.slug}]]",
link_to(ch.name, adventure_character_path(ch.adventure, ch)))}
return text
end
, 나는 형태의 두 링크가있는 경우 두 개의 별도의 통화를했다 [[: 강타]]와 [[: slug | 제목]]. 그 때문에 문자로 불리는 메소드에 추가 변수를 추가했습니다. 그래서 나는 값 비싼 데이터베이스를 검색하는 대신 메서드를 호출하는 곳에서 문자 배열을 전달할 수 있습니다. 사용하려는 문자 목록을 이미 알고 있습니다.
[Regexp Capture Groups] (http://ruby-doc.org/core-1.9.3/Regexp.html#label-Capturing)을 사용하여 거기에서 슬럿과 link_title을 추출 할 수 있습니다. –
@ThomasKlemm 링크를 보내 주셔서 감사합니다. 내가 생각해 낸 답을 게시 할 것이다. 귀하의 의견에 +1을 드리고 싶지만이 사이트는 완전히 새로운 것입니다. 등급을 어떻게 올리나요? – hoonsan
고마워요. 일부 답변에 upvotes가 표시되고 특정 임계 값을 초과하면 바로 의견을 upvote 할 수 있습니다. 아래 답변으로 당신의 일하는 해결책을 게시하여 사람들이 그것으로부터 배울 수 있다면 좋을 것입니다. –