【发布时间】:2011-09-25 02:46:04
【问题描述】:
我想做的是制作一个“行话终结者”。 基本上我在数据库中有一些 html 和一些词汇表术语。 当人们点击 jargon buster 时,它会用一个漂亮的工具提示 (wztooltip) 替换文本中的单词,从而显示它们的含义。
我一直在努力解决这个问题,并认真研究了这个问题 Regex / DOMDocument - match and replace text not in a link
似乎答案就在 simple_html_dom 库中,但我无法让它工作。 显然,任何已经链接的单词都不会被触及。 这是我所拥有的内容的简要说明。
$html = str_get_html($article['content']);
$query_glossary = "SELECT word,glossary_term_id,info FROM glossary_terms WHERE status = 1 ORDER BY LENGTH(word) DESC";
$result_glossary = mysql_query_run($query_glossary);
while($glossary = mysql_fetch_array($result_glossary)) {
$glossary_link = SITEURL.'/glossary/term/'.string_to_url($glossary['word']).'-'.$glossary['glossary_term_id'];
if(strlen($glossary['info'])>400) {
$glossary_info = substr(strip_tags($glossary['info']),0,350).' ...<br /> <a href="'.$glossary_link.'">Read More</a>';
}
else {
$glossary_info = $glossary['info'];
}
$glossary_tip = 'href="javascript:;" onmouseout="UnTip();" class="article_jargon_highligher" onmouseover="'.tooltip_javascript('<a href="'.$glossary_link.'">'.$glossary['word'].'</a>',$glossary_info,400,1,0,1).'"';
$glossary_word = $glossary['word'];
$glossary_word = preg_quote($glossary_word,'/');
//once done we can replace the words with a nice tip
foreach ($html->find('text') as $element) {
if (!in_array($element->parent()->tag,array())) {
//problems are case aren't taken into account and grammer
$element->innertext = str_ireplace(''.$glossary['word'].' ',' <a '.$glossary_tip.' >'.$glossary['word'].'</a> ', $element->innertext);
//$element->innertext = str_ireplace(''.$glossary['word'].',',' <a '.$glossary_tip.'>'.$glossary['word'].'</a> ', $element->innertext);
//$element->innertext = preg_replace ("/\s(".$glossary_word.")\s/ise","nothing(' <a'.'$glossary_tip.'>'.'$1'.'</a> ')" , $element->innertext);
// $element->innertext = str_replace('__glossary_tip_replace__',$glossary_tip, $element->innertext);
}
}
}
$article['content'] = $html->save();
【问题讨论】:
-
我是同事。真正的问题是我们很难让代码只匹配单个单词而不是单词中的单词(即:也许是 APS)。这些词也在 HTML 中。所以这需要考虑。
-
这肯定只是编写一个足够强大的正则表达式的一个例子,可能使用空格和标点符号来检测单词边界,尽管我不会因为尝试而让自己尴尬。 +1
-
你想要JS解决方案还是PHP解决方案,因为你使用了两个标签?
-
嗨,我不久前写了一个维基媒体扩展,它做了类似的事情。根据您的方法,很容易得到一个低效的解决方案。可能对你有帮助:github.com/bcoughlan/Extension-Lingo/blob/master/Lingo.php
标签: php javascript regex dom replace