Замена ссылки на дополнительную информацию, как исключить - PullRequest
1 голос
/ 29 марта 2012

Я работаю над сообщениями на форуме, где мне нужно заменить введенные пользователем URL-адреса специальным форматированием (включая значок и т. Д.).Пользовательский ввод может быть следующим:

<p>This is a link: http://www.url1.com/</p>
<p>http://www.url2.com/</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>

В частности, мне нужно заменить две первые ссылки (url1.com & url2.com) на измененные данные (необходимо изменить внутри блока кода,~ 30 строк кода).Тем не менее, я еще не нашел хороший способ реализовать такую ​​вещь.

Если я сделаю

html.gsub(/http[s]?:\/\/[^(\s|<)]+/) { |url| "REPLACED" }

Я получу:

<p>This is a link: REPLACED</p>
<p>REPLACED</p>
<p><img src="REPLACED something</p>

Так что в основном,все остальное, кроме работы, но img src неправильно определяется как ссылка.

Я также пытался исключить возможные начальные символы для ссылки ("и", поскольку html заранее очищен, являясь допустимым html).

comment.gsub(/[^\"\']http[s]?:\/\/[^(\s|<\"\')]+/) { |url| "REPLACED" }

Этот вид работ приводит к следующему результату:

<p>This is a link:REPLACED</p>
<pREPLACED</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>

Однако первый (и, возможно, последний) символ потерян. Я пытался использовать \ 1 и т. Д. Внутриблок кода, но не смог найти способ включить первый символ.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 30 марта 2012

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

require 'uri'
text = '<p>This is a link: http://www.url1.com/</p>
<p>http://www.url2.com/</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>'
URI.extract(text)

links => ["link:", "http://www.url1.com/"," http://www.url2.com/", "http://www.url3.com/image.jpg"]

А затем замените все ссылки на «ЗАМЕНЕННЫЕ» с помощью gsub.

links.shift => "link :"
links.each do |link|
  text = text.gusb(link, "REPLACED")
end

и вывод текста

"<p>This is a link : REPLACED</p>\n<p>REPLACED</p>\n<p><img src=\"REPLACED\"> something</p>"

Надеюсь, что поможет.

0 голосов
/ 30 марта 2012

Я решил это с помощью rinku (https://github.com/tanoku/rinku/tree/)

Rinku.auto_link(comment, :urls, 'target="_blank" rel="nofollow"') do |url|
  "parsed stuff"
end
0 голосов
/ 29 марта 2012

Вы, вероятно, хотите избежать регулярных выражений для разбивки HTML / XML.Попробуйте nokogiri.См. https://stackoverflow.com/a/610653/158285

[ОБНОВЛЕНИЕ]

или

https://stackoverflow.com/a/2699994/158285

[ОБНОВЛЕНИЕ]

Я переделал вышеперечисленное в вашу проблему, и вот она

require 'cgi'
require 'rubygems' rescue nil
require 'nokogiri'

file_path = "your_page.html"
txt =  <<-EOF
    <p>This is a link: http://www.url1.com/</p>
    <p>http://www.url2.com/</p>
    <p><img src="http://www.url3.com/image.jpg"> something</p>
EOF
doc = Nokogiri::HTML txt
doc.css("img").each do |link|
  puts link
  link.attributes["src"].value = "REPLACED"
end

puts doc.to_s

# SECOND SOLUTION

require 'uri'
rtxt = txt.gsub URI.regexp do |match|
  "REPLACED"
end
puts rtxt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...