2009-03-23 3 views
1

私はランダムなウェブサイトを解析し、すべての単語が(辞書のツールチップのための)リンクになるようにコンテンツを修正し、iframeにウェブサイトを表示したいと考えています。リモートWebサイトを解析して、辞書のツールチップのすべての単語にリンクを作成するにはどうすればよいですか?

私は完全な解決策を探しているわけではありませんが、ヒントや可能な戦略のためです。リンクは私の問題です。ウェブサイトを解析してiframeに表示するのは簡単です。だから基本的に私はすべてのhtmlコンテンツを持つStringを持っています。サーバサイドでやるのが良いのか、ページがJSでロードされたのかは分かりません。

私はRuby on Rails、jQuery、jRailsで作業しています。

注:hrefタグの内容は単語によって異なります。

明確化: 私は正規表現を試してみましたが、それはすでに一種の作品:

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

しかし、問題は、テキストのみの単語を交換し、そのままHTMLを残すことです。だから私はそれが正規表現の問題だと思います...

ありがとうございました。

答えて

2

正規表現がこれで動作するとは思わないか、少なくとも、常に脆いでしょう。より良い方法は、HpricotまたはNokogiriを使用してページを解析し、それを通過してプレーンテキストのノードを変更することです。

1

ほとんどの場合、すでに計画されているようです。

スプリット言葉にして、単語ごとに、リンクを作成するコンテンツ、(あなたのコメントに基づいて)のような<a href="http://dictionary.reference.com/dic?q=whatever&search=search">whatever</a>

EDIT: ああ...私はあなたが画面スクレーピング技術の周りを探索をお勧めします。それらのほとんどは<と>文字の間のものを取り除き、<br>と<p>を改行で置き換えることから始めるべきです。

+0

ありがとうございますが、それは難しいです。私はこれを試しました @ site.gsub!(/ [A-Za-z] +(?:[' - [A-Za-z] +)?\\ d +(?:[、。] \\ d +)?/){| word | '' + word + ''} しかし、私はHTMLタグではなくテキスト内の単語を置き換える方法が必要です。何か案は? –

-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でこれを書いています。あなたはそれをルビーまたはjsに変換する必要があるだろうと思うが、アイデアは同じである。

+0

あなたの正規表現は少し読みにくいですが、>と<の間のすべてのテキストをマッチさせ、それを単語に分解する別の関数に渡すこともできます。あなたがうまく形成されたHTML(タグで始まりタグで終わる)を持っていると仮定すると、端の場合は必要ありません。 – mpen

+0

これは、フォームのスクリプトを完全に混乱させるでしょう

+0

いいえ、それは実際には起こりません。スクリプトタグ内のすべてをハッシュするようにハッシュパターンを変更するだけで、コードが解析されないようにするだけです。実際、それが私がこのクラスを書いた理由です。 – mpen

1

正規表現を使用する前にNokogiriを使用してHTML構造を削除します。

no_html = Nokogiri::HTML(html_as_string).text 
関連する問題