2013-01-31 3 views
0

하나 개의 문자 (article.rb를) 제거 기사의 텍스트에 단어 "anylink""link_to 'anylink', 'http://website.com/anylink'"과 함께 사용하면 자동 링크를 만들 수 있습니다. "link_to..."이 이미있는 경우 정규 표현식에서 anylink 이후에 '을 제외 했으므로 대체하지 않습니다.GSUB 내가 기사의 모델이

그래도 작동하지만, "anylink" 다음의 문자를 삭제하는 것이 문제입니다. 예 : 지금이 두 번째 구절에서

"Have a look at anylink and see" 

"Have a look at anylinkand see" 

"anylink"

에 하이퍼 링크, 그래서 모든 것이 gsub 작업 중 삭제 된 누락 된 공간을 제외하고 괜찮 : 그것은 변환합니다. 왜 어떤 생각을하고 어떻게 피할 수 있습니까?

답변

2

String#gsub 여기에 아포스트로피되지 않습니다 anylink 문자열 한 문자 교체,와 패턴의 전체 일치하는 부분을 대체합니다. 당신은 당신의 성격을 유지하려면

  • anylinkA
  • anylink.
  • anylink!

, 당신은 일치를 만들 수 넣어 :

그래서 예를 들어 다음과 같은 문자열을 대체 할 것이다 그 교체 후 :

self.content.gsub!(/anylink([^'])/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>\\1") 

여기서 일치하는 그룹 ([^'])은 문자와 일치하며 이스케이프 처리 된 \1은 교체 한 후에 해당 문자를 넣습니다.

하지만 난 당신이 일치하도록 \b를 사용하는 것이 좋습니다 word boundary :

그래서이 솔루션 단어 anylink는 gsub로 대체 될 것이며, 그것은 숫자를 앞에 또는 문자를 따라하지만 할 수
self.content.gsub!(/\banylink\b/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>") 

.

self.content.gsub!(/\banylink\b/ig, "<%= link_to 'anylink', 'http://website.com/anylink' %>") 
+0

감사 :

당신이 self.content 일치하는 항목을 모두 교체 g 정규 표현식 수정을 추가하려면

. 나는 첫 번째 해결책을 완전히 이해하지 못했고, 행 끝에 \\ 1을 추가하여 행동을 바꾸지 않았다. 두 번째 제안은 기사를 처음 편집 할 때 잘 작동하지만 두 번째로 "link_to 'anylink', 'http ...'를 'link_to'link_to 'anylink', http ... ', http로 대체합니다 ... '. 그 이유는 내가 단어의 끝에 (gsub! (/ anylink ([^ '])/i 등이있을 경우 gsub의 실행을 제외했기 때문입니다.) – user929062

+0

콘텐츠에서 대체물을 여러 번 실행한다고 언급하지 않았습니다. 그렇게하면 매번'anylink' 문자열을 대체하게됩니다. 링크 안에는 링크가있을 것입니다. –

+0

예, 죄송합니다. 그래서 내가/anylink ([^ '])/정규 표현식을 사용하여 문제를 해결할 수 있습니다. 앞에서 말했듯이, 그것은 또한 뒤에있는 캐릭터를 지우는 것입니다. 그것이 주된 문제입니다. – user929062