«RuntimeError: строка изменена», когда я пытаюсь gsub!входящая строка внутри каждого - PullRequest
0 голосов
/ 25 декабря 2018

Мой метод получает строки с некоторыми URL.URL могут содержать только символы ascii или любые другие:

"тест non-latin url http://url.cоm and test only-latin url https://url.com"

Я хочу проанализировать свои входящие строки, а затем изменить все совпадения в исходной строке следующим образом:

"тест non-url <b>[NON-LATIN LETTERS: http://url.cоm]</b> and test only-latin url <a href="https://url.com">https://url.com</a>"

и передатьэто к следующему методу.

Я использовал each с gsub!:

def validate_url(string)
  validate_url = string.gsub(/((http|https):\/\/.*?)(\s|$|\n|\Z|\t|\r|<.)/)

  validate_url.each do |link|
    if link.ascii_only?
      string.gsub!(link, "<a href=\"#{link}\">#{link}</a>")
    else
      string.gsub!(link, "<b>[NON-LATIN LETTERS: #{link}]</b>")
    end
  end
end

Я вижу RuntimeError: string modified ошибку и не понимаю, почему и как это исправить.

1 Ответ

0 голосов
/ 25 декабря 2018

По какой-то причине эта строка отказывается изменяться.Хотя мы еще не выяснили, почему, вот как можно обойти проблему: не изменяйте строку на месте, возвращайте новую строку.

def validate_url(string)
  string.gsub(/((http|https):\/\/.*?)(\s|$|\n|\Z|\t|\r|<.)/) do |link|
    if link.ascii_only?
      "<a href=\"#{link}\">#{link}</a>"
    else
      "<b>[NON-LATIN LETTERS: #{link}]</b>"
    end
  end
end

Затем

clean = validate_url(string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...