首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索和替换HTML中的单词

搜索和替换HTML中的单词
EN

Stack Overflow用户
提问于 2011-06-29 20:14:41
回答 3查看 2.3K关注 0票数 22

我想做的是做一个“行话终结者”。基本上,我在数据库中有一些html和一些术语表术语。当用户点击jargon buster时,它会用一个很好的工具提示(wztooltip)来替换文本中的单词,以显示它们的含义。

我在这个问题上一直很努力,也一直在认真研究这个问题Regex / DOMDocument - match and replace text not in a link

似乎答案就在simple_html_dom库中,但我在让它工作时遇到了麻烦。显然,任何已经链接的单词都不会被触动。这是我手头上所有东西的一小部分。

代码语言:javascript
复制
$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();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-02 02:19:59

使用inverted word character \W为正则表达式模式中除数字和字母以外的任何字符进行选择。因为这仍然会在文本blob的边界处失败,所以您还需要测试这些条件。因此使用单词'term‘作为您要搜索的文本:

代码语言:javascript
复制
(^term$)|(^term\W)|(\Wterm\W)|(\Wterm$)

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

如果您希望将任何其他字符视为单词字符(例如连字符),则需要使用[^\w\-]重新调整\W的步调。

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

票数 11
EN

Stack Overflow用户

发布于 2011-07-02 11:32:30

假设您的所有术语表“单词”都由标准的“单词”字符组成(即[A-Za-z0-9_]),那么在正则表达式模式中,可以在单词之前和之后放置一个简单的单词边界断言。尝试将相关语句替换为以下语句:

代码语言:javascript
复制
$element->innertext = preg_replace(
    '/\b'. $glossary_word .'\b/i',
    '<a '. $glossary_tip .' >'. $glossary['word'] .'</a>',
    $element->innertext);

这里假设$glossary_word已经通过preg_quote运行(您的代码就是这么做的)。

但是,如果术语表单词可能包含其他非标准单词字符(如'-'破折号),则可以制定一个更复杂的正则表达式,该正则表达式结合了前视和后视,以确保只匹配整个单词。例如:

代码语言:javascript
复制
$re_pattern = "/         # Match a glossary whole word.
    (?<=[\s'\"]|^)       # Word preceded by whitespace, quote or BOS.
    {$glossary_word}     # Word to be matched.
    (?=[\s'\".?!,;:]|$)  # Word followed by ws, quote, punct or EOS.
    /ix";
票数 8
EN

Stack Overflow用户

发布于 2011-07-07 10:30:53

我在JS获取单个单词时遇到了这个问题。我所做的如下所示(您可以将其从JS转换为PHP):

它对我来说真的很好用。:)

代码语言:javascript
复制
var words = document.body.innerHTML;

// FIRST PASS

// remove scripts
words = words.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '');
// remove CSS
words = words.replace(/<style[\s\S]*?>[\s\S]*?<\/style>/gi, '');
// remove comments
words = words.replace(/<!--[\s\S]*?-->/g, '');
// remove html character entities
words = words.replace(/&.*?;/g, ' ');
// remove all HTML
words = words.replace(/<[\s\S]*?>/g, '');

// SECOND PASS

// remove all newlines
words = words.replace(/\n/g, ' ');
// replace multiple spaces with 1 space
words = words.replace(/\s{2,}/g, ' ');

// split each word
words = words.split(/[^a-z-']+/gi);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6520462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档