php - 在 PHP 中创建内联 'Jargon' 帮助程序

标签 php javascript mysql html regex

我有一篇 HTML 格式的文章。它包含很多行话,也许有些人不会理解。

我还有一个术语表(MySQL 表),其中包含对那里的人有帮助的定义。

我想浏览我文章的 HTML 并找到这些词汇表术语的实例,并用一些漂亮的 JavaScript 替换它们,这将显示一个带有术语定义的“工具提示”。

我已经差不多完成了,但我仍然遇到一些问题:

  • 在单词中找到术语(即:APS 在 Perhaps 中)
  • 我必须确保它不会对 alt、标题、链接的文本等执行此操作。因此只有未应用任何格式的文本。但它需要在表格和段落中发挥作用。

这是我的代码:

$query_glossary = "SELECT word FROM glossary_terms WHERE status = 1 ORDER BY LENGTH(word) DESC";
$result_glossary = mysql_query_run($query_glossary);

//reset mysql via seek so we don't have to do the query again
mysql_data_seek($result_glossary,0); 

while($glossary = mysql_fetch_array($result_glossary)) {

    //once done we can replace the words with a nice tip
    $glossary_word = $glossary['word'];
    $glossary_word = preg_quote($glossary_word,'/');        
    $article['content'] = preg_replace_callback('/[\s]('.$glossary_word.')[\s](.*?>)/i','article_checkOpenTag',$article['content'],10);     
}

这是 PHP 函数:

function article_checkOpenTag($matches) {
  if (strpos($matches[0], '<') === false) {
    return $matches[0];
  } 
    else {
        $query_term = "SELECT word,glossary_term_id,info FROM glossary_terms WHERE word = '".escape($matches[1])."'";
        $result_term = mysql_query_run($query_term);
        $term = mysql_fetch_array($result_term);

        # CREATING A RELEVENT LINK
        $glossary_id = $term['glossary_term_id'];
        $glossary_link = SITEURL.'/glossary/term/'.string_to_url($term['word']).'-'.$term['glossary_term_id'];

        # SOME DESCRIPTION STUFF FOR THE TOOLTIP
        if(strlen($term['info'])>400) {
            $glossary_info = substr(strip_tags($term['info']),0,350).' ...<br /> <a href="'.$glossary_link.'">Read More</a>';
        }
        else {
            $glossary_info = $term['info'];
        }


        return ' <a href="javascript:;" onmouseout="UnTip();" class="article_jargon_highligher" onmouseover="'.tooltip_javascript('<a href="'.$glossary_link.'">'.$term['word'].'</a>',$glossary_info,400,1,0,1).'">'.$matches[1].'</a> '.$matches[2];
  }
}

最佳答案

将负载从服务器转移到客户端。假设您的“俚语词典”更改不频繁,并且您想为很多文章中的单词“添加漂亮的工具提示”,您可以将其导出到 .js 文件中并在页面中添加相应的 <script> 条目 -只是一个静态文件,很容易被网络浏览器缓存。

然后编写一个客户端 js 脚本,它会尝试找到一个放置“a content with slang”的 dom 节点,然后从你的字典中解析出出现的单词并用一些 html 包装它们以显示工具提示。一切都用 js,一切都在客户端。

如果该方法不合适并且您打算在 php 后端中完成这项工作,至少考虑对已处理的内容进行一些缓存。

我还看到您为内容中的每个“行话词”插入了描述文本。如果一个词在一篇文章中出现频率很高怎么办?你得到开销。将描述分开,将它们作为对象放入 JS 中。任务是找到有描述的单词,并使用一些短标签标记它们,例如 。您的 js 脚本应该找到 em,从对象中选择一个描述(带有单词描述的关联数组)并在“鼠标悬停”事件上动态构建工具提示。

关于php - 在 PHP 中创建内联 'Jargon' 帮助程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549542/

相关文章:

mysql - localhost 和 phpmyadmin 加载空白页面

php - 从 Xcode 将数据发布到外部数据库

javascript - 在 MySQL INSERT 之前解析 Promise 对象

php - Google 搜索字词 - 包含搜索内容的着陆页

javascript - Typeahead Bootstrap 返回 ID 和值 Json

javascript - JS - 如何在特定页面执行代码

javascript - 我该如何使用 Ember.Select ?如何设置默认选择的项目?

javascript - Catch 不处理 promise 的拒绝

php - 二维数组的使用

javascript - 如何在jquery按钮点击之前调用JS函数(通过选择器点击)