2014-12-02 1 views
0

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

<script>window.location.replace(\"https:\\/\\/www.facebook.com\\/myuserprofilename\");</script> 

Мне нужно, чтобы получить текст «myuserprofilename», но я не могу получить регулярное выражение права. Может ли кто-нибудь мне помочь?

+1

на стороне сервера или клиента? –

+0

рубин, серверная сторона – Tony

+0

Вы используете камень 'nokogiri'? –

ответ

1
string = '<script>window.location.replace(\"https:\\/\\/www.facebook.com\\/myuserprofilename\");</script>' 
puts string[/facebook.com\\\/(\w+)/, 1] # => myuserprofilename 
0

Я подозрительно отношусь к формату URL. Это похоже на результат проверки строки, а не на то, что мы обычно видим в HTML или при обработке HTML.

С строкой очищенной до того, как я ожидаю, что будет выглядеть в дикой природе, вот как мы будем использовать Nokogiri для разбора HTML, найти содержимое <script> тега, а затем получить доступ к последней части пути в URL-адресе:

require 'nokogiri' 
require 'uri' 

doc = Nokogiri::HTML('<html><body><script>window.location.replace("https://www.facebook.com/myuserprofilename");</script></body></html>') 
url = doc.at('script').text[/\("(.+)"\)/, 1] # => "https://www.facebook.com/myuserprofilename" 
File.basename(URI.parse(url).path) # => "myuserprofilename" 

Использование регулярных выражений для поиска конкретного тега <script> гораздо более подвержено ошибкам, чем при использовании парсера, такого как Nokogiri. Как только тег найден, захват его содержимого легко с помощью text, а затем его легко можно использовать с помощью метода URI path. Передавая это File.basename, вы получаете код, который повторно использует существующие проверенные колеса и более устойчив, так как HTML и URL-адреса слишком изменчивы.

Смежные вопросы