Ruby on rails 如何解析远程网站并为字典工具提示在每个单词上创建链接?
我想解析一个随机网站,修改内容,使每个单词都是一个链接(对于字典工具提示),然后在iframe中显示该网站 我不是在寻找一个完整的解决方案,而是一个提示或一个可能的策略。链接是我的问题,解析网站并在iframe中显示它非常简单。所以基本上我有一个包含所有html内容的字符串。我甚至不确定是在服务器端还是在页面加载了JS之后进行 我正在使用RubyonRails、jQuery和jRails 注意:href标记的内容取决于单词 澄清: 我尝试了一个regexp,它已经可以工作了:Ruby on rails 如何解析远程网站并为字典工具提示在每个单词上创建链接?,ruby-on-rails,ruby,regex,parsing,tooltip,Ruby On Rails,Ruby,Regex,Parsing,Tooltip,我想解析一个随机网站,修改内容,使每个单词都是一个链接(对于字典工具提示),然后在iframe中显示该网站 我不是在寻找一个完整的解决方案,而是一个提示或一个可能的策略。链接是我的问题,解析网站并在iframe中显示它非常简单。所以基本上我有一个包含所有html内容的字符串。我甚至不确定是在服务器端还是在页面加载了JS之后进行 我正在使用RubyonRails、jQuery和jRails 注意:href标记的内容取决于单词 澄清: 我尝试了一个regexp,它已经可以工作了: @site.gsu
@site.gsub!(/[A-Za-z]+(?:['-][A-Za-z]+)?|\\d+(?:[,.]\\d+)?/) {|word| '<a href="">' + word + '</a>'}
@site.gsub!(/[A-Za-z]+(?:['-][A-Za-z]+)?|\\d+(?:[,.]\\d+)/){word |''
但问题是只替换文本中的单词,而保留HTML的原样。所以我想这是一个正则表达式问题
谢谢你的建议。听起来你已经计划好了 将内容拆分为单词,然后为每个单词创建链接,如
编辑(根据您的评论):
啊。。。我建议你四处搜索屏幕抓取技术。他们中的大多数人都应该从删除
和。我认为regexp对此不起作用,或者至少,它总是很脆弱的。更好的方法是使用or解析页面,然后遍历它并修改纯文本节点 简单。散列HTML,运行正则表达式,然后取消散列HTML
<?php
class ht
{
static $hashes = array();
# hashes everything that matches $pattern and saves matches for later unhashing
function hash($text, $pattern) {
return preg_replace_callback($pattern, array(self,'push'), $text);
}
# hashes all html tags and saves them
function hash_html($html) {
return self::hash($html, '`<[^>]+>`');
}
# hashes and saves $value, returns key
function push($value) {
if(is_array($value)) $value = $value[0];
static $i = 0;
$key = "\x05".++$i."\x06";
self::$hashes[$key] = $value;
return $key;
}
# unhashes all saved values found in $text
function unhash($text) {
return str_replace(array_keys(self::$hashes), self::$hashes, $text);
}
function get($key) {
return self::$hashes[$key];
}
function clear() {
self::$hashes = array();
}
}
?>
哦。。。对,我是用PHP写的。我猜您必须将其转换为ruby或js,但想法是一样的。在使用正则表达式之前,我会使用Nokogiri删除HTML结构
no_html = Nokogiri::HTML(html_as_string).text
谢谢,但这有点难。我试过这个@site.gsub!(/[A-Za-z]+(?:['-][A-Za-z]+)?| \\d+(?:[,.]\\d+)/{word |''''}但是我需要一种方法来只替换文本中的单词,而不是html标记。有什么想法吗?你的正则表达式有点难读,但是你也可以匹配>之间的所有文本,这会把表单的脚本弄得一团糟。。。不,事实上不会。您只需要修改散列模式来散列脚本标记中的所有内容,这样代码就不会被解析。事实上,这正是我写这门课的原因。
no_html = Nokogiri::HTML(html_as_string).text