我有一篇 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/