来自自定义词汇表的自动网站工具提示?

时间:2012-11-13 15:17:09

标签: php jquery tooltip

我有一个包含大量技术内容的PHP网站。我为网站上使用的一些比较模糊的术语创建了一个词汇表。每当用户将鼠标悬停在其中一个术语上时,我希望显示工具提示(或提示气泡,无论它们被称为什么)。

我发现大量的jQuery扩展似乎可以实现我想要的功能但是需要通过将span标记设置为特定类来手动链接到每个术语实例。

我希望自动完成此操作。我该怎么办?

2 个答案:

答案 0 :(得分:3)

我建议做这个服务器端。当页面上有许多元素时,jQuery插件会降低页面的速度。 你可能得到类似的东西:

$content = "<p>Lorem ajax ipsum</p>";

$terms = array(
    'ajax' => 'Asynchronous JavaScript and XML',
);

foreach ($terms as $term => $explained) {
    $content = str_replace($term, '<acronym title="' . htmlspecialchars($explained) . '">' . $term . '</acronym>', $content);
}

答案 1 :(得分:0)

我建立了sroes&#39;回答,但需要解决两个问题:

  • 部分词语,即在定义&#34; rap&#34;时,你不想在#34;那些猛禽中取代它#34;
  • 替换自我,即&#34; song&#34;的定义包括单词&#34; rap&#34;,然后它将被再次替换,导致定义之上的定义。

这个例子很可能通过正则表达式或其他方式来改进,以删除嵌套的foreach循环,建议欢迎 - 但请记住stritr中的序列替换。

function add_glossary_tooltips($text) {
    global $glossary;
    if(empty($glossary))
        return $text;
    // Create array of replacements, using only individual
    // words surrounded by spaces or other punctuation

    $endings = array(
        '.',
        ' ',
        ',',
        '!',
        '-',
        '?',
        '&',
    );
    $beginnings = array(
        '-',
        ' ',
    );
    $replacements = array();
    foreach ($glossary as $entry) {
        $clean_defintion = htmlentities(strip_tags($entry['definition']), ENT_QUOTES);
        $replacement = "<abbr
                class='tooltip'
                title='".$clean_defintion."'
            >"
            .$entry['glossary_word']
            ."</abbr>";
        foreach ($endings as $ending) {
            foreach ($beginnings as $beginning) {
                $replacements[$beginning.$entry['glossary_word'].$ending] = $beginning.$replacement.$ending;
            }
        }
    }

    $text = stritr($text, $replacements);

    return $text;
}

自定义不区分大小写的strstr支持此功能。 (不是我的工作)

function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
    if(  is_string( $one )  ){
        $two = strval( $two );
        $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
        $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
        $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
        return $product;
    }
    else if(  is_array( $one )  ){
        $pos1 = 0;
        $product = $string;
        while(  count( $one ) > 0  ){
            $positions = array();
            foreach(  $one as $from => $to  ){
                if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                    unset(  $one[ $from ]  );
                }
                else{
                    $positions[ $from ] = $pos2;
                }
            }
            if(  count( $one ) <= 0  )break;
            $winner = min( $positions );
            $key = array_search(  $winner, $positions  );
            $product = (   substr(  $product, 0, $winner  ) . $one[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
            $pos1 = (  $winner + strlen( $one[$key] )  );
        }
        return $product;
    }
    else{
        return $string;
    }
}/* endfunction stritr */