Как разобрать удаленный сайт и создать ссылку на каждое слово для подсказки словаря? - PullRequest
1 голос
/ 23 марта 2009

Я хочу проанализировать случайный веб-сайт, изменить его содержимое, чтобы каждое слово было ссылкой (для всплывающей подсказки словаря), а затем отобразить веб-сайт в 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 ]

2 голосов
/ 23 марта 2009

Я не думаю, что регулярное выражение будет работать для этого - или, по крайней мере, оно всегда будет хрупким. Лучший способ - проанализировать страницу, используя Hpricot или Nokogiri , затем пройти по ней и изменить узлы, представляющие собой простой текст.

1 голос
/ 26 марта 2009

Я бы использовал Nokogiri, чтобы удалить структуру HTML, прежде чем использовать регулярное выражение.

no_html = Nokogiri::HTML(html_as_string).text
1 голос
/ 23 марта 2009

Звучит так, как будто у вас уже все спланировано.

Разделите содержимое на слова, а затем для каждого слова создайте ссылку, например <a href="http://dictionary.reference.com/dic?q=whatever&search=search">whatever</a>

РЕДАКТИРОВАТЬ (на основе вашего комментария): Ааа ... Я рекомендую вам поискать методы очистки экрана. Большинство из них должны начинаться с удаления чего-либо между символами <и> и замены
и

символами новой строки.

0 голосов
/ 23 марта 2009

Simple. Хешируйте 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, но идея та же.

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