在PHP中创建一个内联的“术语”助手

时间:2011-07-01 14:48:38

标签: php javascript mysql html regex

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

我还有一个术语表(MySQL表),其定义对那些人有帮助。

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

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

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

这是我的代码:

$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];
  }
}

2 个答案:

答案 0 :(得分:1)

将负载从服务器移动到客户端。假设您的“俚语词典”不经常更改并且您想要在很多文章中“添加漂亮的工具提示”,您可以将其导出到.js文件中并添加相应的&lt; script&gt;进入你的页面 - 只是一个可以通过网络浏览器轻松缓存的静态文件。

然后编写一个客户端js脚本,试图找到一个dom节点,其中放置了“带有俚语的内容”,然后解析出你的字典中出现的单词并用一些html包装它们来显示提示。一切都与js,客户端的一切。

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

我还看到您为内容中找到的每个“行话词”插入说明文字。如果一篇文章在文章中非常频繁怎么办?你得到了开销。将这些描述分开,将它们作为对象放入JS中。任务是找到具有描述的单词并使用一些短标记来标记它们,例如&lt; em&gt;。你的js-script应该找到em`s,从对象中选择一个描述(关联数组和单词的描述)并在“mouse over”事件上动态构造工具提示。

答案 1 :(得分:0)

有趣的是,我正在寻找的不是像你这样的问题,但在阅读时我意识到你的问题是我很久以前经历过的问题

它基本上是一个解析字典并吐出增强HTML的系统。

我的建议包括:

  1. 如果需要,请使用数据库,但缓存生成的CSV文件可以更快地用作字典
  2. 在渲染系统中使用钩子来解析此词典中的实际内容
  3. 页面缓存也很有用
  4. I elaborated a solution on my blog(法语,对不起)。但它基本上概述了你可以实际用来做的事情。

    我将其称为“ContentAbbrGenerator”作为MODx插件。但插件的原始可以在已建立的结构之外应用。

    无论如何,您可以下载zip文件并获取RegExes并找到解决方法。

    我的目标

    1. 使用一个读取的文件来获取html的装饰。
    2. 从作者输入的内容中生成html,该内容不了解辅助功能和标签(dfn和/ abbr)
    3. 让它可以重复使用。
    4. 让它成为可爱的。也就是说,在法语中,我们使用英语定义,但是适应性技术用法语读取英语单词并且听起来很奇怪。所以我们必须使用lang =“”属性来说清楚。
    5. 我做了什么

      基本上你给的文字更具语义性。

      想象一下以下词典:

      en;abbr;HTML;Hyper Text Markup Language;es
      en;abbr;abbr;Abbreviation
      

      然后,CMS输入的内容可能会吐出如下文本:

      <p>Have you ever wanted to do not hassle with HTML abbr tags but was too lazy to hand-code them all!? That is my solution :)</p>
      

      这被翻译成:

          <p>Have you ever wanted to do not hassle with <abbr title="Hyper Text Markup Language" lang="es">HTML</abbr> <abbr title="Abbreviation">abbr</abbr> tags but was too lazy to hand-code them all!? That is my solution :)</p>
      

      全部取决于您可以从数据库生成的一个CSV文件。

      我使用的约定

      1. 文件/abbreviations.txt在服务器上公开可用(可生成)是一个字典,每个accronym一个定义
      2. 实现只需读取文件并在将其发送到客户端之前应用它
      3. 工具提示

        我强烈建议您使用甚至Twitter Bootstrap实现的工具提示工具。它基本上会读取您想要的任何标记标记的标题。

        看看那里:Bootstrap from Twitter with Toolip helper

        PS:我很擅长使用这个Bootstrap项目提出的模式,值得一看!!