1

我想解析一个随机网站,修改内容,使每个单词都是一个链接(用于字典工具提示),然后在 iframe 中显示该网站。

我不是在寻找完整的解决方案,而是在寻找提示或可能的策略。链接是我的问题,解析网站并将其显示在 iframe 中非常简单。所以基本上我有一个包含所有 html 内容的字符串。我什至不确定是在服务器端还是在页面加载 JS 之后更好。

我正在使用 Ruby on Rails、jQuery、jRails。

注意:href 标记的内容取决于单词。

澄清:我尝试了一个正则表达式,它已经起作用了:

@site.gsub!(/[A-Za-z]+(?:['-][A-Za-z]+)?|\\d+(?:[,.]\\d+)?/) {|word| '<a href="">' + word + '</a>'}

但问题是只替换文本中的单词并保持 HTML 不变。所以我想这是一个正则表达式问题......

感谢您的任何想法。

4

4 回答 4

2

我认为正则表达式不会为此工作 - 或者,至少,它总是很脆弱。更好的方法是使用HpricotNokogiri解析页面,然后通过它并修改纯文本节点。

于 2009-03-23T19:17:19.127 回答
1

听起来你已经计划好了。

将内容拆分为单词,然后为每个单词创建一个链接,例如<a href="http://dictionary.reference.com/dic?q=whatever&search=search">whatever</a>

编辑(根据您的评论):啊……我建议您四处搜索屏幕抓取技术。他们中的大多数应该从删除 < 和 > 字符之间的任何内容开始,并将 <br> 和 <p> 替换为换行符。

于 2009-03-23T18:18:27.177 回答
1

在您使用正则表达式之前,我会使用 Nokogiri 删除 HTML 结构。

no_html = Nokogiri::HTML(html_as_string).text
于 2009-03-26T02:56:27.867 回答
-2

简单的。散列 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();
    }
}
?>

示例用法:

ht::hash_html($your_html);
// your word->href converter here
ht::unhash($your_formatted_html);

哦...对,我是用 PHP 写的。猜猜你必须将它转换为 ruby​​ 或 js,但想法是一样的。

于 2009-03-23T20:08:16.133 回答