Регулярное выражение - заменить слово, кроме как внутри URL / URI - PullRequest
2 голосов
/ 29 января 2010

Написание модуля глобализации для веб-приложения, и мне нужно регулярное выражение, чтобы заменить все вхождения слова другим словом (переводом) - кроме слов, найденных в URL / URI.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я использую Ruby, поэтому я не могу использовать 'Lookbehind'

Ответы [ 3 ]

4 голосов
/ 31 января 2010
  • Разделить на регулярное выражение URI; включите URI в результат.
  • За каждый кусок:
    • если это URI, оставьте его в покое
    • в противном случае, заменить слово
  • Соединить фигуры

Код:

# From RFC 3986 Appendix B, with these modifications:
#   o Spaces disallowed
#   o All groups non-matching, except for added outermost group
#   o Not anchored
#   o Scheme required
#   o Authority required
URI_REGEX = %r"((?:(?:[^ :/?#]+):)(?://(?:[^ /?#]*))(?:[^ ?#]*)(?:\?(?:[^ #]*))?(?:#(?:[^ ]*))?)"

def replace_except_uris(text, old, new)
  text.split(URI_REGEX).collect do |s|
    if s =~ URI_REGEX
      s
    else
      s.gsub(old, new)
    end
  end.join
end

text = <<END
stack http://www.stackoverflow.com stack
stack http://www.somewhere.come/stack?stack=stack#stack stack
END

puts replace_except_uris(text, /stack/, 'LINKED-LIST')

# => LINKED-LIST http://www.stackoverflow.com LINKED-LIST
# => LINKED-LIST http://www.somewhere.come/stack?stack=stack#stack LINKED-LIST
0 голосов
/ 29 января 2010

Вы пытались разбить свой текст на слова и перебирать слова? Затем вы можете проверить каждое слово, определить, является ли это URI, перевести его, если это не так.

0 голосов
/ 29 января 2010

Вы можете, вероятно, использовать что-то вроде

(?<!://[^ ]*)\bfoo\b

Но это, вероятно, не идеально, просто выглядит, что слово не появляется ни в одной непробельной строке символов, у которых нет :// где-то перед словом.

PS Home:\> "foo foobar http://foo_bar/baz?gak=foobar baz foo" -replace '(?<!://[^ ]*)\bfoo\b', 'FOO'
FOO foobar http://foo_bar/baz?gak=foobar baz FOO
...