php - 在 HTML 中搜索和替换单词

标签 php javascript regex dom replace

我想做的是制作一个“行话终结者”。 基本上我在数据库中有一些 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();

最佳答案

使用反字字符 \W 选择正则表达式模式中数字和字母以外的任何字符。因为这仍然会在文本 blob 的边界处失败,所以您还需要测试这些条件。因此,使用“术语”一词作为您要搜索的文本:

(^term$)|(^term\W)|(\Wterm\W)|(\Wterm$)

第一个条件检查以确保该术语不是 blob 的唯一内容,第二个条件检查它是否是第一个单词,第三个条件检查它是否包含在 blob 中,最后一个条件是否是最后一个单词。

如果您想将任何其他字符视为单词字符(例如连字符),您需要将 \W 替换为 [^\w\-]

希望这对您有所帮助。可能还可以执行优化,但这至少应该是一个好的起点。

关于php - 在 HTML 中搜索和替换单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520462/

相关文章:

php - 无法将文本区域输入传递给 PHP 变量

javascript - 更快地从 URL 参数加载数据

regex - 从电子表格中单元格的值解析字符串和对象

javascript - 如何在javascript中将多个单词替换为单个单词?

php - 如何从URL中获取hash(#)后的数据?

php - 为每个用户创建一个集合与为所有用户创建一个集合

php - 将特定部分 div 转换为 pdf

javascript - ReactJS 的首选测试方法?

javascript - 我如何访问 SOAP 响应属性?

javascript - 上传的文件如果文件名带括号()则不上传